我正在使用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或任何其他机制对单个查询还有其他简单的方法吗?
答案 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"
}
}
}
}
])