如何使用mongodb聚合来丰富$lookup对象?



我使用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连接值并创建数组userslocations
  • 当使用_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"
}
}
}
])

例子

相关内容

  • 没有找到相关文章

最新更新