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

Mongoose在读取/查找时删除不在架构上的字段,mongoose,mongoose-schema,Mongoose,Mongoose Schema,我有一个模式: const LinkSchema=newmongoose.Schema({ 名称:{type:String}, 样式:{default:“icon”,类型:String}, }); 以及mongoDB中已经存在的文档,其中可能包含许多旧字段 { “名称”:“abcLink”, “老一套”:没错, “老东西2”:“oeunth”, .... “oldThing100”:“嗨”, } 我想link.findOne({name:“abcLink”})返回 { “名称”:“abcLi

我有一个模式:

const LinkSchema=newmongoose.Schema({
名称:{type:String},
样式:{default:“icon”,类型:String},
});
以及mongoDB中已经存在的文档,其中可能包含许多旧字段

{
“名称”:“abcLink”,
“老一套”:没错,
“老东西2”:“oeunth”,
....
“oldThing100”:“嗨”,
}
我想
link.findOne({name:“abcLink”})
返回

{
“名称”:“abcLink”,
“样式”:“图标”
}
目前,我得到

{
“名称”:“abcLink”,
“老东西”:真的,
“样式”:“图标”
}
如果没有返回架构中未定义的任何字段,如何通过
strict
读取来获取过滤对象


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

您可以使用类似这样的转换函数来重写
toJSON
方法,这样它就不会有任何不在模式中的字段

const mongoose=require(“mongoose”);
const LinkSchema=newmongoose.Schema({
名称:{type:String},
样式:{默认:“图标”,类型:字符串}
});
var schemaFields=Object.key(LinkSchema.path);
LinkSchema.set(“toJSON”{
转换:功能(文档、ret、选项){
让结果={};
Object.keys(ret.map)(key=>{
if(schemaFields.includes(键)){
结果[键]=返回[键];
}
});
返回结果;
}
});
module.exports=mongoose.model(“Link”,LinkSchema);

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

问题是,isNew是一个保留字,很难找到答案。@SuleymanSah我将
isNew
重命名为
oldThing
。结果是相同的。然后,将该字段添加到架构中,并将其选择选项设置为false。现在,该字段将不会被检索,其想法是从模式中删除不再使用的字段,以便它们不再保存在数据库中或被选中。我想这会让他们继续得救,我也不想这样。(目前,使用
strict:true
保存时,它们会被正确删除)这是否回答了您的问题?如果有嵌套对象路径,则路径包含完整路径,即
详细信息。由于
details
上的键
ret
未被复制,因此会导致太多内容被删除。使用
constschemafields=Object.keys(LinkSchema.tree)为我修复了它,因为模式字段包含
详细信息
而不是
详细信息。对于嵌套对象,您可能需要添加一些内容
@Loren,但我认为这是您可以找到的最佳方法。如果您将其更改为Object.keys(LinkSchema.tree),而不是Object.keys(LinkSchema.Path)。它对嵌套树和没有嵌套树都很有效。@Loren-hmm-super,我用这些信息更新了答案。如果你能记为答案并投票,我将不胜感激。我为此付出了很大的努力:)