MongoDB -如何在嵌套对象下使用多个条件进行搜索

r3i60tvu  于 2023-03-17  发布在  Go
关注(0)|答案(1)|浏览(117)

我正在寻找一种搜索集合的方法,以过滤以下数据,从而找到包含类(101,102,103)的组;而101和102的数量不足100。提前感谢您。

[
  {
    "group": "1",
    "classes": [
      {
        "id": "101",
        "quantity": "100",
        "type": "AAA"
      },
      {
        "id": "102",
        "quantity": "24",
        "type": "BBB"
      },
      {
        "id": "103",
        "quantity": "10",
        "type": "BBB"
      },
      {
        "id": "104",
        "quantity": "16",
        "type": "AAA"
      },
      {
        "id": "105",
        "quantity": "25",
        "type": "AAA"
      },
      {
        "id": "106",
        "quantity": "20",
        "type": "BBB"
      },
      {
        "id": "107",
        "quantity": "24",
        "type": "AAA"
      }
    ]
  },
  {
    "group": "2",
    "classes": [
      {
        "id": "101",
        "quantity": "20",
        "type": "AAA"
      },
      {
        "id": "102",
        "quantity": "30",
        "type": "BBB"
      },
      {
        "id": "113",
        "quantity": "100",
        "type": "BBB"
      },
      {
        "id": "114",
        "quantity": "16",
        "type": "AAA"
      },
      {
        "id": "115",
        "quantity": "20",
        "type": "AAA"
      },
      {
        "id": "116",
        "quantity": "20",
        "type": "BBB"
      },
      {
        "id": "117",
        "quantity": "80",
        "type": "AAA"
      }
    ]
  },
  {
    "group": "3",
    "classes": [
      {
        "id": "101",
        "quantity": "60",
        "type": "AAA"
      },
      {
        "id": "102",
        "quantity": "240",
        "type": "BBB"
      },
      {
        "id": "103",
        "quantity": "1",
        "type": "BBB"
      },
      {
        "id": "104",
        "quantity": "16",
        "type": "AAA"
      },
      {
        "id": "105",
        "quantity": "2",
        "type": "AAA"
      },
      {
        "id": "106",
        "quantity": "20",
        "type": "BBB"
      },
      {
        "id": "107",
        "quantity": "240",
        "type": "AAA"
      }
    ]
  }
]
ep6jt1vc

ep6jt1vc1#

查询需要聚合运算符,要使用它,您需要$expr运算符。
过滤后的单据需要同时满足以下两个条件:
1.文档需要包含值为“101”、“102”、“103”的classes.id,并验证返回结果不是空数组。
1.单据需要在classes数组中至少有一项满足id in ["101", "102"]数组,并且quantity(需要转换为数字)小于100。

db.collection.find({
  $expr: {
    $and: [
      {
        $ne: [
          {
            $setIntersection: [
              "$classes.id",
              [
                "101",
                "102",
                "103"
              ]
            ]
          },
          []
        ]
      },
      {
        $ne: [
          {
            $filter: {
              input: "$classes",
              cond: {
                $and: [
                  {
                    $in: [
                      "$$this.id",
                      [
                        "101",
                        "102"
                      ]
                    ]
                  },
                  {
                    $lt: [
                      {
                        $toInt: "$$this.quantity"
                      },
                      100
                    ]
                  }
                ]
              }
            }
          },
          []
        ]
      }
    ]
  }
})

Demo @ Mongo Playground

相关问题