两部分问题
我想按单个字段对记录进行分组。
然后检索用户信息
我想按 REF_NotifierID 字段进行分组。
这是数据。
[
{
"_id": "66d90957373dd9d5c85d503c",
"REF_NotifierID": "66d9070f373dd9d5c85d5034",
"REF_UserID": "66c8fbb1a97fee2ae10a3d81",
},
{
"_id": "66d90a33373dd9d5c85d5050",
"REF_NotifierID": "66d90700373dd9d5c85d502e",
"REF_UserID": "66c8fbb1a97fee2ae10a3d81",
},
{
"_id": "66d9ca6be74061bbd0d1996a",
"REF_NotifierID": "66d90700373dd9d5c85d502e",
"REF_UserID":"66d9c3ddc1d6fcc235ccc92e",
}
]
第 1 部分
这是我尝试过的...没有用:-(
$group : {
REF_NotifierID: {
$first: "$REF_NotifierID",
$users: "REF_UserID",
}
}
这是我想要返回的唯一数据,并且采用这种结构:
{
"notifiers": [
{
"REF_NotifierID": "66d9070f373dd9d5c85d5034",
"users": [
{
"REF_UserID": "66c8fbb1a97fee2ae10a3d81"
}
]
},
{
"REF_NotifierID": "66d90700373dd9d5c85d502e",
"users": [
{
"REF_UserID": "66c8fbb1a97fee2ae10a3d81"
},
{
"REF_UserID": "66d9c3ddc1d6fcc235ccc92e"
}
]
}
]
}
感谢@cmgchesss! 此分组正确
{
"$group": {
"_id": "$REF_NotifierID",
"users": {
"$addToSet": {
"REF_UserID": "$REF_UserID"
}
}
}
},
{
"$group": {
"_id": null,
"notifiers": {
"$push": {
"REF_NotifierID": "$_id",
"users": "$users"
}
}
}
},
{
"$unset": "_id"
}
第 2 部分
我想从分组结果中获取用户信息
我尝试过查找
$lookup: {
from: 'users',
localField: 'REF_UserID',
foreignField: '_id',
as: 'testusers',
},
这就是我得到的:
[
{
"notifiers": [
{
"REF_NotifierID": "66d9070f373dd9d5c85d5034",
"users": [
{
"REF_UserID": "66c8fbb1a97fee2ae10a3d81"
}
]
},
{
"REF_NotifierID": "66d90700373dd9d5c85d502e",
"users": [
{
"REF_UserID": "66c8fbb1a97fee2ae10a3d81"
},
{
"REF_UserID": "66d9c3ddc1d6fcc235ccc92e"
}
]
}
],
"testusers": []
}
]
我希望使用用户表中用户的名字、姓氏字段来扩充 REF_UserID。
例如:
{
"REF_UserID": "66d9c3ddc1d6fcc235ccc92e",
"firstName": "Fred",
"lastName" : "Jones",
}
您可以在查找阶段内使用
$documents
对数组中的每个元素执行对 users 集合的单独查找。
此管道中的步骤:
db.notifier.aggregate([
{$group: {
_id: "$REF_NotifierID",
users: {$push: {REF_UserID: "$REF_UserID"}}
}},
{$lookup: {
let: {docs: "$users"},
as: "users",
pipeline: [
{$documents: "$$docs"},
{$lookup: {
from: "users",
localField: "REF_UserID",
foreignField: "_id",
as: "userData",
pipeline: [
{$project: {
_id: 0,
firstname: 1,
lastname: 1,
REF_UserID: "$_id"
}}
]
}},
{$unwind: "$userData" },
{$replaceRoot: {newRoot: "$userData"}}
]
}}
])
示例:游乐场