我有两个集合,一个是用户,另一个是地址。 用户文档包含包含publicId地址的列表。
我正在编写一个API来获取用户。如何返回用户和地址文档的合并结果?
用户:
{
"_id" : ObjectId("5684f3c454b1fd6926c324fd"),
"email" : "user@example.com",
"userId" : "userId",
"addresses" : ["A1234","A5678"]
}
地址:
{
"_id" : ObjectId("56d82612b63f1c31cf906004"),
"publicId" : "A1234"
"addressLine1" : "AD1",
"addressLine2" : "AD1",
"pin" : "001"
}
{
"_id" : ObjectId("56d82612b63f1c31cf906005"),
"publicId" : "A5678"
"addressLine1" : "AD2",
"addressLine2" : "AD2",
"pin" : "002"
}
我想要实现的是
{
"_id" : ObjectId("5684f3c454b1fd6926c324fd"),
"email" : "user@example.com",
"userId" : "userId",
"addresses" : [
{
"publicId" : "A1234"
"addressLine1" : "AD1",
"addressLine2" : "AD1",
"pin" : "001"
},
{
"publicId" : "A5678"
"addressLine1" : "AD2",
"addressLine2" : "AD2",
"pin" : "002"
}
]
}
如何使用聚合查询实现此目的?
答案 0 :(得分:1)
为此您可以使用聚合框架中的$lookup stage:
db.user.aggregate([
{$lookup:
{
from : 'addresses',
localField: 'Addresses',
foreignField: 'publicId',
as: 'Addresses'
}
},
{$project: {'Addresses._id': 0} }
]).pretty()
使用$ lookup(类似于左外连接),您需要使用MongoDB 3.2或更高版本。
答案 1 :(得分:0)
我得到了它的工作。以下是我使用的聚合查询。
db.user.aggregate([
{
$unwind: "$addresses"
},
{
$lookup:
{
from: "address",
localField: "addresses",
foreignField: "publicId",
as: "addresses"
}
},
{
$match: {
"userId":"userId",
"addresses": { $ne: [] }
}
}
])