在猫鼬中,当我想向已创建的字段添加新内容时,save()、insertOne() 和 updateOne() 之间有什么区别?

问题描述 投票:0回答:2

例如我有一个模式

 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?

mongodb mongoose
2个回答
2
投票

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()
             })

0
投票

您可以在 Mongodb insertOne

上查看 Mongodb insertOne 的完整指南
© www.soinside.com 2019 - 2024. All rights reserved.