Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB聚合:如何检查数组中是否存在包含多个属性的对象_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

MongoDB聚合:如何检查数组中是否存在包含多个属性的对象

MongoDB聚合:如何检查数组中是否存在包含多个属性的对象,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个对象数组,我想检查是否有一个对象匹配多个属性。我曾尝试在和$和中使用$,但它没有按我希望的方式工作 我有一个类似的数组 "choices": [ { "name": "choiceA", "id": 0, "l": "k" }, { "name": "

我有一个对象数组,我想检查是否有一个对象匹配多个属性。我曾尝试在和$和中使用
$,但它没有按我希望的方式工作

我有一个类似的数组

"choices": [
    {
        "name": "choiceA",
        "id": 0,
        "l": "k"
    },
    {
        "name": "choiceB",
        "id": 1,
        "l": "j"
    },
    {
        "name": "choiceC",
        "id": 2,
        "l": "l"
    }
]
我正在尝试编写聚合代码,以检查是否存在同时包含
“id”:2
“l”:“j”
属性的对象。我当前的实现检查是否有包含第一个属性的对象,然后检查是否有包含第二个属性的对象

我怎样才能得到我想要的结果

下面,请参阅我的聚合查询。完整的代码是


上面的查询返回true,但是数组中没有对象,这两个属性都是
id:2
“l”:“J”
。我知道代码按预期工作。我怎样才能得到我想要的结果呢?

你想使用类似


编辑

在聚合
$project
阶段中,我将使用


我更新了标题,使其更加清晰。我想检查数组中是否存在包含两个特定属性的对象。我知道如何使用一个属性。我在
中使用
$。但是我怎么能用两个属性来做呢?我不确定我是否理解,
选项:[{id:2,l:k},{id:3,l:j}]
一个匹配的文档?不。在这个问题中,我有一个指向聚合查询的链接,显示了我试图实现的目标。我编辑了我的答案,以匹配您使用的管道,由于不能在聚合项目阶段使用
$elemMatch
,因此我将使用
$filter
db.poll.aggregate([
  {
    "$match": {
      "_id": 100
    }
  },
  {
    $project: {
      numberOfVotes: {
        $and: [
          {
            $in: [
              2,
              "$choices.id"
            ]
          },
          {
            $in: [
              "j",
              "$choices.l"
            ]
          }
        ]
      },
      
    }
  }
])
db.collection.find({
  choices: {
    $elemMatch: {
      id: 2,
      l: "j"
    }
  }
})
db.poll.aggregate([
  {
    "$match": {
      "_id": 100
    }
  },
  {
    $project: {
      numberOfVotes: {
        $gt: [
          {
            $size: {
              $filter: {
                input: "$choices",
                as: "choice",
                cond: {
                  $and: [
                    {
                      $eq: [
                        "$$choice.id",
                        2
                      ]
                    },
                    {
                      $eq: [
                        "$$choice.l",
                        "j"
                      ]
                    }
                  ]
                }
              }
            }
          },
          0
        ]
      }
    }
  }
])