如何从具有相似字段值的多个集合中查找文档

How to find documents from multiple collection with similar field value

我有两个合集:

产品

{ id: "1", model: "Light1", category: "Light"},
{ id: "2", model: "Light3", category: "Light"},
{ id: "3", model: "Lock1", category: "Lock"},

项目

{ id: "1", model: "Light1", category: "Light", color: "Blue"},
{ id: "2", model: "Light2", category: "Light", color: "Blue"},
{ id: "3", model: "Lock1", category: "Lock", color: "Blue"},
{ id: "4", model: "Light3", category: "Light", color: "Blue"}
{ id: "5", model: "Lock2", category: "Lock", color: "Blue"},

我想从包含产品集合中的模型和类别的项目集合中查找文档。

从上面的例子中,我想得到这个所谓的新集合:

{ id: "1", model: "Light1", category: "Light", color: "Blue"},
{ id: "3", model: "Lock1", category: "Lock", color: "Blue"},
{ id: "4", model: "Light3", category: "Light", color: "Blue"}

您可以试试这个聚合查询:

  • 第一个 $lookup 从项目集合中加入集合。此查找使用匹配所需值的管道:本地 model 等于外部 model,本地 category 等于外部 category。这将生成一个数组作为输出:如果没有任何匹配项,则该数组将为空。
  • 所以你可以$match不显示空result数组。
  • 并使用$project输出你想要的值。
db.Item.aggregate([
  {
    "$lookup": {
      "from": "Product",
      "let": {
        "model": "$model",
        "category": "$category"
      },
      "pipeline": [
        {
          "$match": {
            "$and": [
              {
                "$expr": {
                  "$eq": [
                    "$model",
                    "$$model"
                  ]
                }
              },
              {
                "$expr": {
                  "$eq": [
                    "$category",
                    "$$category"
                  ]
                }
              }
            ]
          }
        }
      ],
      "as": "result"
    }
  },
  {
    "$match": {
      "result": {
        "$ne": []
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "result": 0
    }
  }
])

示例here