分组时选择不相等的值

问题描述 投票:0回答:1

每份文件都描述了客户协议(决定,不是价值),简体:

{
    "_id": "123",
    "customerID" : "Smith"
    "agreement": [
        {"agreementType":"A"
        "agreementValue":"T"},
        {"agreementType":"B"
        "agreementValue":"T"}]
}
{
    "_id": "124",
    "customerID" : "Smith"
    "agreement": [
        {"agreementType":"A"
        "agreementValue":"F"},
        {"agreementType":"B"
        "agreementValue":"T"}]
}
{
    "_id": "125",
    "customerID" : "Brown"
    "agreement": [
        {"agreementType":"A"
        "agreementValue":"T"},
        {"agreementType":"B"
        "agreementValue":"T"}]
}
{
    "_id": "126",
    "customerID" : "Brown"
    "agreement": [
        {"agreementType":"A"
        "agreementValue":"T"},
        {"agreementType":"B"
        "agreementValue":"T"}]
}

我需要查询所有具有相同协议类型的不同协议值的客户(例如,单个客户同意但第二天不同意)。 它应该返回 Smith(agreementType=A 的不同值)。

目前我可以找到所有重复项,但不能仅限于具有不同值的那些

mongodb mongodb-query aggregation-framework
1个回答
0
投票

您可以

$unwind
agreement
数组并执行
$group
以获得
agreementValue
的不同值。
$match
$size
大于 1 以获得所需的记录。

db.collection.aggregate([
  {
    "$unwind": "$agreement"
  },
  {
    "$group": {
      "_id": {
        "customerID": "$customerID",
        "agreementType": "$agreement.agreementType"
      },
      "agreementValues": {
        "$addToSet": "$agreement.agreementValue"
      }
    }
  },
  {
    $match: {
      $expr: {
        $gt: [
          {
            $size: "$agreementValues"
          },
          1
        ]
      }
    }
  },
  {
    $group: {
      _id: "$_id.customerID"
    }
  }
])

Mongo 游乐场

© www.soinside.com 2019 - 2024. All rights reserved.