亲子冲销结果

时间:2018-10-04 05:32:49

标签: mongodb aggregation-framework

我正在使用MongoDB 3.4。

具有以下2个集合。

收藏1:- 类型

{
  "_id": {
    "$numberLong": "1234"
  },
  "name" : "board1"
  "type" : "electronic"
},
{
  "_id": {
    "$numberLong": "1235"
  },
  "name" : "board2",
  "type" : "electronic"
}

收藏2:-产品

{
  "_id": {
    "$numberLong": "9876"
  },
  "types" : [
     "1234",
     "1235",
     "1238"
   ]
},
{
  "_id": {
    "$numberLong": "9875"
  },
  "types" : [
     "1234",
     "1238"
   ]
}

类型集合将具有多种类型,并且产品集合中的每个产品将具有多种类型。

对于类型集合中的同一类型,可以有多个具有不同ID的文档。而且,产品集合可能具有带有相同类型或不同类型的不同ID的类型数组。

我想获取电子类型的所有ID,并在每个产品的类型数组中找到具有ID的产品。

我想要下面的结果。

{
  "_id": {
    "$numberLong": "1234"
  },
  "name" : "board1",
  "products" : [
     "9876",
     "9875"
   ]
},
{
  "_id": {
    "$numberLong": "1235"
  },
  "name" : "board2"
  "products" : [
     "9876",
     "9875"
   ]
}

目前,我正在打电话这么多,就像每种类型的ID一样,要获取所有产品。

使用$ lookup或任何其他机制对单个查询还有其他简单的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以在mongodb 3.6 及更高版本

中尝试以下聚合
db.types.aggregate([
  { "$match": { "type" : "electronic" }},
  { "$lookup": {
    "from": "testCollection2",
    "let": { "typeId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$$typeId", "$types"] }}}
    ],
    "as": "products"
  }},
  { "$addFields": {
    "products": "$products._id"
  }}
])

您可以在mongodb 3.4

中尝试以下聚合
db.types.aggregate([
  { "$match": { "type" : "electronic" }},
  { "$lookup": {
    "from": "testCollection2",
    "localField": "_id",
    "foreignField": "types",
    "as": "products"
  }},
  { "$addFields": {
    "products": "$products._id"
  }}
])

答案 1 :(得分:1)

在MongoDB 3.4中,您可以使用$lookup,然后使用$addFields_id获取products

db.types.aggregate([
    {
        "$match": { "type" : "electronic" }
    },
    {
        $lookup: {
            from: "products",
            localField: "_id",
            "foreignField": "types",
            "as": "products"
        }
    },
    {
        $project: {
            field1: 1,
            field2: 1,
            products: {
                $map: {
                    input: "$products",
                    as: "p",
                    in: "$$p._id"
                }
            }
        }
    }
])