首页 > 解决方案 > $in 查询数组字段 Mongo db

问题描述

我有一个这样的文档

{
  "_id" : "oidfi",
   "users": [
        {
            "_id": "q",
            "tags": ["a", "b", "c"],
            "age": 20

        },
        {
            "_id": "q",
            "tags": ["x", "y", "z"],
            "age": 30

        }
    ],
    "type": "repo"
}

我想用几个字段过滤用户数组(我可以用下面的查询来做到这一点)

    {
        "$match": {
            "$and": [
                {
                    "_id": "a506f8af6f510f616bea14715276d474d2b363f0aef10443cc0f11559b139147"
                }
            ]
        }
    },
    {
        "$project": {
            "users": {
                "$filter": {
                    "input": "$users",
                    "as": "users",
                    "cond": {
                        "$and": [
                            {
                                "$gte": [
                                    "$$user.age",
                                    15
                                ]
                            }
                        ]
                    }
                }
            }
        }
    }
]

有没有办法让我添加条件,在其中我给出标签项目列表并从他们的标签数组中获取匹配至少一个项目的用户

$$user.tags.containsAny(["a", "x"])

谢谢

标签: arraysmongodbmongodb-queryaggregation-framework

解决方案


您可以在聚合管道中执行以下操作:

  1. $setIntersection找出users.tags数组和输入数组的交集,即示例中的 ["a", "x"]
  2. $size在步骤 1 中找到数组的大小
  3. $match步长 2 的大小大于 0
"anyTagsMatched": {
        $gt: [
          {
            $size: {
              "$setIntersection": [
                "$users.tags",
                [
                  "a",
                  "x"
                ]
              ]
            }
          },
          0
        ]
      }

这是Mongo游乐场供您参考。


推荐阅读