【问题标题】:MongoDB conditional lookupMongoDB条件查找
【发布时间】: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


【解决方案1】:

$unwind 默认情况下会在要展开的数组为空时删除文档。您可以使用preserveNullAndEmptyArrays 选项更改该行为:

{  $unwind: { path: '$parent', preserveNullAndEmptyArrays: true } }

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2019-06-14
    • 2022-01-20
    • 2018-07-09
    • 2015-12-25
    相关资源
    最近更新 更多