【问题标题】:$in Query on Array Field Mongo db$in 查询数组字段 Mongodb
【发布时间】:2021-10-12 08:27:49
【问题描述】:

我有这样的文档

{
  "_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"])

谢谢

【问题讨论】:

标签: arrays mongodb mongodb-query aggregation-framework


【解决方案1】:

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

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

这是Mongo playground 供您参考。

【讨论】:

    【解决方案2】:

    你可能喜欢关注

    db.collection.aggregate([
      {
        "$project": {
          "users": {
            "$filter": {
              "input": "$users",
              "cond": {
                "$and": [
                  { "$gte": [ "$$this.age", 15 ] },
                  {
                    $gt: [
                      {
                        $size: {
                          "$setIntersection": [
                            "$$this.tags",
                            [ "a", "x" ]
                          ]
                        }
                      },
                      0
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    工作Mongo playground

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 2021-01-09
      • 2014-03-19
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2019-05-17
      • 1970-01-01
      相关资源
      最近更新 更多