javascript - 如何根据“父”ID 进行填充然后匹配
问题描述
我正在尝试将引用的文档(已填充)与父文档 ID“匹配”。目标是仅显示特定组织的成员权限,而不是他们可能拥有的所有其他权限。所以'entity.item',在这种情况下是一个组织,必须匹配父组织ID。我正在尝试找出如何(如果可能)从子文档访问父组织 ID。
let userId = '123';
let organizations = await Organization.find().where('members.includes(userId)').populate({
path: 'members',
options: { sort: { name: 1 } },
populate: {
path: 'permissions',
match: {
'entity.kind': 'Organization',
'entity.item': organization._id //HERE
},
populate: {
path: 'entity.item'
}
}
});
解决方案
我最终在聚合方法上使用了查找运算符。仍在测试用例,但似乎正在工作。以下答案为我指明了那个方向。
“使用 mongodb 3.6 及更高版本的 $lookup 语法,在不使用 $unwind 的情况下连接嵌套字段非常简单。”
let organizations = await Organization.aggregate([
{ $sort: { name: 1 } },
{ $match: { $expr: { $in: [ user.id, '$members' ] } } },
{
$lookup: {
from: 'user',
let: { id: '$_id', members: '$members' },
pipeline: [
{ $match: { $expr: { $in: [ '$_id', '$$members' ] } } },
{ $addFields: { id: '$_id' } },
{
$lookup: {
from: 'permission',
pipeline: [
{ $match: { $expr: { $and: [
{ $eq: [ '$entity.kind', 'Organization' ] },
{ $eq: [ '$entity.item', '$$id' ] }
] } } },
{ $addFields: { id: '$_id' } },
{
$lookup: {
from: 'organization',
pipeline: [
{ $match: { $expr: { $eq: [ '$_id', '$$id' ] } } },
{ $addFields: { id: '$_id' } }
],
as: 'entity.item'
}
}
],
as: 'permissions'
}
}
],
as: 'members'
}
},
{ $addFields: { id: '$_id' } }
]);
推荐阅读
- wpf - 删除 FlowDocument 中两个表之间的空格
- selenium-webdriver - 如何在 ChromeDriver 中使用 GET 发送标头
- excel - 不存在的循环引用和/或非计算公式
- vba - MS Access VBA 使用“with”引用子报表上的控件
- kubernetes - Kubernetes 蚊子密码
- c# - 解决另一个异步调用后触发一个异步调用
- python - 如何从列表的一部分中选择一个随机元素?
- css - Pad Left 在移动设备上不起作用
- c++ - 从 .csv 文件读取到具有未知 # 行/列的字符串向量的向量
- tensorflow - 这两个准确度指标有什么区别?