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
,这样会导致删除太多,因为details
是ret
上的一个键,不会被复制过来。使用const schemaFields = Object.keys(LinkSchema.tree);
为我修复了它,因为架构字段包含details
而不是details.something
。
@Loren 对于嵌套对象,您可能需要添加一些内容,但我认为这是您能找到的最佳方法。
如果将其更改为 Object.keys(LinkSchema.tree),而不是 Object.keys(LinkSchema.paths)。它适用于嵌套树以及没有嵌套树。
@Loren 嗯超级,我用这个信息更新了答案。如果您可以标记为答案并投票,我将不胜感激。为此我真的很努力:)以上是关于Mongoose 在读取/查找时删除不在架构上的字段的主要内容,如果未能解决你的问题,请参考以下文章
当我“更新”时,Mongoose 操作字段是“查找”,为啥?