【发布时间】:2020-10-16 11:14:38
【问题描述】:
我正在尝试按 ID 查找父字段作为聚合管道的一部分,但只有某些字段有父字段。
所以当有父级时这段代码可以正常工作,但在没有父级时会中断:
//get parent info
{
'$lookup': {
"from": this.parentContentModel,
"localField": "parent",
"foreignField": "_id",
"as": "parent"
}
},
{'$unwind': { path: '$parent' } },
根据this,如果查找不存在也没关系(尽管如果字段名称为空或null则不起作用,所以我放了一个占位符):
//get parent info
{
'$lookup': {
"from": this.parentContentModel || 'noparent',
"localField": "parent",
"foreignField": "_id",
"as": "parent"
}
},
{'$unwind': { path: '$parent' } },
添加它并不能解决它,因为我需要展开它,如果该字段不存在,它会中断。 (如果我取出 unwind,那么当没有父母时它可以正常工作,但是有父母的东西会坏掉,因为它们需要被 unwound)。
根据this,如果值为空,您可以只投影一个空数组,但 $project 会删除所有旧字段:
{'$project': { parent: {'$ifNull': ['$parent', [ null ] ]}}},
所以我尝试使用 $addFields 而不是 $project,但它仍然破坏了没有父字段的东西:
{'$addFields': { parent: {'$ifNull': ['$parent', [ null ] ]}}},
添加该行后,它仍然只适用于有父级的文档,除非我删除 $unwind,这使它只适用于没有父级的文档。
【问题讨论】:
-
你试过
{ $unwind: { path: '$parent', preserveNullAndEmptyArrays: true } }吗? -
是的,这行得通,显然那个单一的标志是秘密。我真的不明白为什么,但它有效。
标签: node.js mongodb mongoose aggregation-framework