例如我有一个模式
const listSchema=new mongoose.Schema({
name:String,
items:Array
});
const List=mongoose.model("List",listSchema);
我做了一个文件 const 列表=新列表({ 名称:“列表1”, 项目:[项目1、项目2、项目3] });
后来我想添加一个名为第 4 项的新项目,所以我使用了
List.findOne({name:list1},function(err,foundList){
foundList.items.push(item4);
foundList.save();
我知道这可能是一个愚蠢的问题,但它让我感到困惑。当我使用
.push
时,我实质上在数组内添加了一个新项目,因此现在数组内有 4 个项目。那么问题来了:为什么当我使用 .save() 时,它没有添加 4 个额外的项目,而是只添加了我想要添加的 item4?
insertOne()
允许您将新文档插入到集合中。而 save()
通过调用该文档的实例来创建一个新文档,即已创建的模型/对象。但是,如果您已获取现有文档并对其调用 .save() (就像您在示例中所做的那样)。它只会用您所做的更改来更新文档。现在,updateOne()
基本上可以让您通过匹配的参数更新现有文档。
示例:
insertOne()
let newDoc = {name:'List2',items =['item1','item2']} // creating a new object to be inserted into the collection
List.insertOne({newDoc},(err,result)=>{
})
updateOne()
{ name: "list1", items:[item1, item2,item3] }
您可以通过执行以下操作来更新字段:
List.insertOne({
name:'list1' // meaning you are looking for a document which has a name of 'list1'
},
{
$push:{items:'item4'// we are using push since we know it's an array field
// you can also do
// {$set:name:'new name'} // if you want to update a string, date etc2x field
},(err,result)=>{
})
.save()
let newList = new List({
name:'list2'
items: ['item1','item2','item3']
})
newList.save();
但是用它来更新现有文档:
在使用
.save()
时,您可能需要明确指定更改或更改了哪个属性/字段。 Mongoose 以不同的方式处理嵌套或深层对象属性。这是 mongoose 网站上的文档:查看此处
在您的情况下,您需要在保存之前执行额外的步骤,即指定您已修改的属性/路径,如下所示:
List.findOne({name:'list1'},
(err,foundList) => {
foundList.items.push(item4);
foundList.markModified('items')
foundList.save()
})
您可以在 Mongodb insertOne
上查看 Mongodb insertOne 的完整指南