使用mongoose,如何将对象属性添加到存储在mongodb中不包含在模式中的对象?



我希望能够添加一个新的对象属性,以存储在mongodb数据库的模型模式不包括该属性的文档中的对象。我在谷歌上看到了各种各样的例子,但似乎没有一个有效,所以我想自己问这个问题,并得到一些直接的答案。

例如:

const MapSchema = new mongoose.Schema({
name:{
type: String
}
})
const ListMap = mongoose.model("listmap", MapSchema);

现在我想给它添加一个新属性使用id

model.ListMap.findByIdAndUpdate(_id, {newprop:"whatever");
model.ListMap.findByIdAndUpdate(_id, {name:"test");

使用这两个命令,我可以添加name:"test"但是我不能添加newprop: ' whatever ';到它。我想要做的是能够添加一个新属性,而不必首先在模式中声明它。我知道这个问题好像以前有人问过,但我已经在谷歌上搜索过了,我不相信有人回答过这个问题。他们要么不理解这个问题,要么他们的代码实际上不起作用。

还有额外的问题,为什么mongodb总是添加一个s到集合名称?如果我使用.create()来添加第一个对象,那么上面的代码将显示在collection "listmaps"中。

对于你的第一个问题,你不能在不先声明属性的情况下向模式添加属性。你可以这样定义一个泛型属性:

const MapSchema = new mongoose.Schema({
property:{
title: String,
value: String
}
})
const ListMap = mongoose.model("listmap", MapSchema);

,第二个问题你可以参考这个答案:为什么mongoose总是在我的集合名后面加一个s

——解决 -------------

我在这里为其他人添加这个,因为我很难在谷歌上找到这个。这个答案来自另一个stackexchange link

如何为mongoDB文档的现有子对象添加新的key:value对

基于此,这就是我之前提出的方法

const commentMapSchema = new mongoose.Schema({
List:{}
})
const CommentsMap = mongoose.model("commentmap", commentMapSchema);

const update = {$set: {["List."+"test2"] : "data2"}};
CommentsMap.findByIdAndUpdate(id, update);

首先需要在模式中声明属性。这个属性可以包含更多的属性,就像javascript对象一样。然后使用带有mongoose的更新方法和查询,该查询通过点表示法将属性名称与新属性组合在一起。但是,当以这种方式添加属性时,键必须是字符串。这与javascript中的工作原理完全相同。你可以创建一个新名字它会添加到对象属性中

我希望这能帮助到其他降落在这里的人。

最新更新