我使用Pymongo对我们的Mongodb运行聚合管道。
我有以下集合:
用户
{
_id: 1,
name: 'John Doe',
age: 30
},
{
_id: 2,
name: 'Jane Doe',
age: 20
}
位置
{
_id: 10,
name: 'Miami'
},
{
_id: 20,
name: 'Orlando'
}
联系人
{
_id: 100,
contacts: [
{
user_id: 1,
location_id: 10,
},
{
user_id: 2,
location_id: 20,
}
]
}
作为聚合管道的结果,我需要:
{
_id: 100,
contacts: [
{
user_id: 1,
user_name: 'John Doe',
user_age: 30,
location_id: 10,
location_name: 'Miami'
},
{
user_id: 2,
user_name: 'Jane Doe',
user_age: 20,
location_id: 20,
location_name: 'Orlando'
}
]
}
我尝试了一些查询使用'$lookup',但我只是得到一个新的数组,而不是把值在相同的数组/对象。
我怎样才能得到想要的结果?
您可以使用以下聚合查询:
- 第一个
$unwind
解构数组并获取连接 的值 - 然后两个
$lookup
连接值并创建数组users
和locations
。 - 当使用
_id
时,你想要的数组值是第一个(它应该只有一个值,但如果存在多个将是重复的值),所以你可以使用$arrayElemAt
。 - 然后
$project
得到你想要的字段名。 - 和
$group
重新组合值。
db.contacts.aggregate([
{
"$unwind": "$contacts"
},
{
"$lookup": {
"from": "users",
"localField": "contacts.user_id",
"foreignField": "_id",
"as": "users"
}
},
{
"$lookup": {
"from": "locations",
"localField": "contacts.location_id",
"foreignField": "_id",
"as": "locations"
}
},
{
"$set": {
"users": {
"$arrayElemAt": [
"$users",
0
]
},
"locations": {
"$arrayElemAt": [
"$locations",
0
]
}
}
},
{
"$project": {
"contacts": {
"user_id": 1,
"location_id": 1,
"user_name": "$users.name",
"user_age": "$users.age",
"location_name": "$locations.name"
}
}
},
{
"$group": {
"_id": "$_id",
"contacts": {
"$push": "$contacts"
}
}
}
])
例子