Mongoose 在读取/查找时删除不在架构上的字段

Posted

技术标签:

【中文标题】Mongoose 在读取/查找时删除不在架构上的字段【英文标题】:Mongoose Remove Fields not on schema on read/find 【发布时间】:2020-06-24 15:21:03 【问题描述】:

我有一个架构:

const LinkSchema = new mongoose.Schema(
    name:  type: String ,
    style:  default: "icon", type: String ,
);

还有一个已经在 mongoDB 中的文档,其中可能包含许多旧字段。


   "name": "abcLink",
   "oldThing1": true,
   "oldThing2": "oeunth",
   ....
   "oldThing100": "hi",

我要link.findOne( name: "abcLink" )返回


   "name": "abcLink",
   "style": "icon"

目前,我得到了


   "name": "abcLink",
   "oldThing": true,
   "style": "icon"

我怎样才能读取strict 以取回未返回架构中未定义的任何字段的过滤对象?

因为我们有 30 多个活动字段和许多非活动字段,所以我们可以定义一次架构,然后自动过滤结果,这一点很重要。我们不想在多个地方重复有效或无效字段。注意:在架构上使用类似 Object.keys 的函数来获取有效字段的数组并使用它进行过滤是完全可以接受的。

【问题讨论】:

问题是isNew是一个保留字,很难找到答案。 @SuleymanSah 我将isNew 重命名为oldThing。结果是一样的。 之后,将该文件添加到架构并将其选择选项设置为 false。现在将不会检索该字段 这个想法是从架构中删除不再使用的字段,这样它们就不会再保存在数据库中或被选中。我认为这会让他们继续得救,我也不希望发生这种情况。 (目前,它们在使用strict: true 保存时会被正确删除。) 这能回答你的问题吗? How to exclude some fields from the document 【参考方案1】:

您可以像这样使用转换函数覆盖toJSON 方法,这样它就没有任何不在架构中的字段。

const mongoose = require("mongoose");

const LinkSchema = new mongoose.Schema(
  name:  type: String ,
  style:  default: "icon", type: String 
);

var schemaFields = Object.keys(LinkSchema.paths);

LinkSchema.set("toJSON", 
  transform: function(doc, ret, options) 
    let result = ;
    Object.keys(ret).map(key => 
      if (schemaFields.includes(key)) 
        result[key] = ret[key];
      
    );

    return result;
  
);

module.exports = mongoose.model("Link", LinkSchema);

更新为 cmets 中提到的 @Loren,对于嵌套对象,我们可以使用 Object.keys(LinkSchema.tree) 而不是 Object.keys(LinkSchema.paths)

【讨论】:

如果你有一个嵌套对象路径包括完整路径,即details.something,这样会导致删除太多,因为detailsret 上的一个键,不会被复制过来。使用const schemaFields = Object.keys(LinkSchema.tree); 为我修复了它,因为架构字段包含details 而不是details.something @Loren 对于嵌套对象,您可能需要添加一些内容,但我认为这是您能找到的最佳方法。 如果将其更改为 Object.keys(LinkSchema.tree),而不是 Object.keys(LinkSchema.paths)。它适用于嵌套树以及没有嵌套树。 @Loren 嗯超级,我用这个信息更新了答案。如果您可以标记为答案并投票,我将不胜感激。为此我真的很努力:)

以上是关于Mongoose 在读取/查找时删除不在架构上的字段的主要内容,如果未能解决你的问题,请参考以下文章

当我“更新”时,Mongoose 操作字段是“查找”,为啥?

模型与架构上的 Node.js 和 mongoose module.exports

Mongoose 查找和删除

Mongoose 在数据库中查找最后十个条目

尝试加入两个文档时无法在 Mongoose 中填充路径

Mongoose 从架构 arr 中删除对象 [重复]