【问题标题】:Mongoose Remove Fields not on schema on read/findMongoose 在读取/查找时删除不在架构上的字段
【发布时间】: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

标签: mongoose mongoose-schema


【解决方案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 嗯超级,我用这个信息更新了答案。如果您可以标记为答案并投票,我将不胜感激。为此我真的很努力:)
猜你喜欢
  • 2017-10-16
  • 2017-01-13
  • 2016-08-29
  • 2019-10-14
  • 1970-01-01
  • 2015-10-18
  • 2014-09-16
  • 2015-11-25
  • 2014-04-05
相关资源
最近更新 更多