我有两个集合:成员资格和类别。 在类别中,我存储了名为ageGroups的对象数组。
memberships : [{
_id: ObjectId,
ageCategory: ObjectId,
ageGroup: ObjectId
}]
categories: {
_id: ObjectId,
ageGroups: [{
_id: ObjectId,
name: String
}, {
_id: ObjectId,
name: String
}, {
_id: ObjectId,
name: String
}]
}
会员资格集合中有ageCategory
和ageGroup
个属性。
现在我需要聚合这两个并得到像这样的结果
[{
id: 'membership id here',
ageGroup: 'Age Group name here'
},{
id: '2 membership id here',
ageGroup: '2 membership age Group name here'
}]
所以我试过
db.memberships.aggregate([
{
$lookup: {
from: 'categories', localField: 'ageCategory', foreignField: '_id', as: 'ageCategory'
}
},
{
$unwind: '$ageCategory'
},
{
$project: {
'group': {
$filter: {
input : '$ageCategory.ageGroups',
as : 'group',
cond : 'group._id' == '$_id'
}
}
}
},
{
$unwind: '$group'
},
{
$project: {
'group' : '$group.name'
}
}
]);
此查询返回空结果。据我所知,过滤条件中的问题
$filter: {
input : '$ageCategory.ageGroups',
as : 'group',
cond : 'group._id' == '$_id'
}
当我尝试在true
中设置cond
时,它会为每个组推送新文档到结果,即使ageGroup不是那个,也被分配给成员资格。谢谢你的帮助!
UPD 我找到了解决方案,
{
$project: {
'group': {
$filter: {
input : '$ageCategory.ageGroups',
as : 'group',
cond : { $eq:['$$group._id', '$ageGroup']}
}
}
}
},
我已经使用$ eq运算符添加了双美元符号,问题已经解决。现在我搜索更好的解决方案,我想要一个得到类似结果的查询
{
"_id" : // member id,
"group" : "1-3 members"
}
{
"_id" : //member id,
"group" : "17-19 members"
}
不在会员资格表中存储ageCategory,仅使用ageGroup id。