Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 mongo$过滤器和子数组中的多个条件_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb mongo$过滤器和子数组中的多个条件

Mongodb mongo$过滤器和子数组中的多个条件,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有这部分收藏: [{ "_id": ObjectId("604f3ae3194f2135b0ade569"), "parameters": [ { "_id": ObjectId("602b7455f4b4bf5b41662ec1"), "name": "Purpose", "options&q

我有这部分收藏:

[{
  "_id": ObjectId("604f3ae3194f2135b0ade569"),
  "parameters": [
    {
      "_id": ObjectId("602b7455f4b4bf5b41662ec1"),
      "name": "Purpose",
      "options": [
        {
          "id": ObjectId("602b764ff4b4bf5b41662ec2"),
          "name": "debug",
          "sel": true
        },
        {
          "id": ObjectId("602b767df4b4bf5b41662ec3"),
          "name": "performance",
          "sel": false
        },
        {
          "id": ObjectId("602b764ff4b4bf5b41662ec4"),
          "name": "security",
          "sel": true
        },
        {
          "id": ObjectId("602b767df4b4bf5b41662ec5"),
          "name": "Not Applicable",
          "sel": false
        }
      ],
      "type": "multiple"
    }]
}]
此查询:

db.testCollection.aggregate([
    { $unwind: "$parameters" },
    {
        $match: {
            "parameters._id": ObjectId("602b7455f4b4bf5b41662ec1"),
        }
    },
    {
        $addFields: {
            match: {
                $filter: {
                    input: "$parameters.options",
                    as: "option",
                    cond: {
                        $and: [
                           { $eq: ["$$option.id", ObjectId('602b764ff4b4bf5b41662ec2')] },
                           { $eq: ["$$option.sel", true] }
                        ]
                    }
                }
            }
        }
    }
])
结果是一个新的数组匹配,在本例中

"match": [
      {
        "id": ObjectId("602b764ff4b4bf5b41662ec2"),
        "name": "debug",
        "sel": true
      }
    ]
如何匹配,例如,对于集合,匹配

"id": ObjectId("602b764ff4b4bf5b41662ec2") and 
"id": ObjectId("602b764ff4b4bf5b41662ec4")

是否有一个包含两个或两个结果或为空的结果数组?

我不确定在
$filter
中的单个条件下是否可能,但您可以尝试使用
$let

  • $let
    来声明一个名为
    filtered
    的变量,并存储过滤结果
  • $in
    检查过滤元素大小是否为2的条件,然后返回过滤结果,否则返回空白数组
  • 您必须在
    $eq
    条件下将与筛选器中的ID数相匹配的号码放入筛选器中

尝试$in操作符而不是$eq,
{$in:[“$$option.id”、[ObjectId(“602b764ff4b4bf5b41662ec2”)、ObjectId(“602B764FF4BF5B41662EC4”)]}
Hi@turivishal,我成功了。它可以工作,但如果我选择一个假id(例如ObjectId(“602b767df4b4bf5b41662ec3”)),则新数组中的结果只有第一个匹配项。我希望它没有匹配。
  {
    $addFields: {
      match: {
        $let: {
          vars: {
            filtered: {
              $filter: {
                input: "$parameters.options",
                as: "option",
                cond: {
                  $and: [
                    {
                      $in: [
                        "$$option.id",
                        [ObjectId("602b764ff4b4bf5b41662ec2"), ObjectId("602b767df4b4bf5b41662ec3")]
                      ]
                    },
                    { $eq: ["$$option.sel", true] }
                  ]
                }
              }
            }
          },
          in: {
            $cond: [
              { $eq: [{ $size: "$$filtered" }, 2] },
              "$$filtered",
              []
            ]
          }
        }
      }
    }
  }