Mongoose - 填充删除的空引用?

Posted

技术标签:

【中文标题】Mongoose - 填充删除的空引用?【英文标题】:Mongoose - null references removed by populate? 【发布时间】:2017-10-27 14:09:31 【问题描述】:

我有一个问题,我不知道如何解决。我有一个 Mongoose 模型,其中包含要填充的引用数组。像这样的:

new mongoose.Schema( 
    arr: [  type: mongoose.Schema.Types.ObjectId, ref: 'Schema2'  ],
);

该数组在我的应用程序的 UI 中表示一个网格,并且设计为固定长度。这个想法是让数组的字段为空,如果它们尚未设置为任何东西,即。未设置任何内容时,数组如下所示:

arr: [ null, null, null, null ]

这在使用 Mongoose 填充生成 UI 时非常有效,直到实际设置了一个字段。例如,如果我将 arr[2] 设置为引用文档,则使用 mongo 工具时数组看起来与预期的一样:

arr: [ null, null, ~ObjectID~, null ]

但使用与之前相同的 Mongoose 填充会删除空字段,返回数组:

arr: [ ~Object of ObjectID~ ]

这使得 UI 只生成预期的四个单元格中的一个。我使用的查询有点像这样:

Model1
    .findOne( ... )
    .populate(
        path: 'arr',
        populate: path: 'secondPopulateInSchema2'
    )
    .exec(function(err, doc) 
        //Generate UI grid using doc.arr
    );

再次,对于填充 null 的数组,按预期(由我)工作,但在至少一个字段具有引用时不会。我不知道为什么,我一直在摆弄选项并试图找出一种干净的解决方法(不使用外部循环和“填充”)。任何帮助将不胜感激!

问候, 霍特

【问题讨论】:

Mongoose 不支持使用 null refs 填充,您可以查看此问题:github.com/Automattic/mongoose/issues/4161 感谢您的链接!对我来说仍然很奇怪,但我会解决它! @TheHult 你找到解决方法了吗?留在完全相同的问题atm:/ 嗯,看起来 Mongoose 现在正在支持它。 -> mongoosejs.com/docs/api.html#model_Model.populate // [options.retainNullValues=false] «boolean» 默认情况下,Mongoose 从填充的数组中删除空值和未定义值。使用此选项使 populate() 保留 null 和未定义的数组条目 - 我会尝试一下。 【参考方案1】:

(2019) Mongoose 现在支持填充同时保留 nullundefined 数组条目。

const options = 
  path: 'path',
  options: 
    retainNullValues: true 
  
;

Model.findOne(...).populate(options).exec(() =>  ... );

在这里阅读:https://mongoosejs.com/docs/api.html#model_Model.populate

【讨论】:

以上是关于Mongoose - 填充删除的空引用?的主要内容,如果未能解决你的问题,请参考以下文章

填充嵌套数组的无引用对象

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

无法通过 mongoose 删除 mongo 数据库

通过 express、mongoose 和 angular 删除 mongo 文档时出现 404

Mongoose populate() 返回没有错误的空数组

Mongoose 虚拟填充和聚合