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

Mongodb 在mongoose中,当我想向已创建的字段添加新内容时,save()、insertOne()和updateOne()之间有什么区别?,mongodb,mongoose,Mongodb,Mongoose,例如,我有一个模式 const listSchema=new mongoose.Schema({ name:String, items:Array }); const List=mongoose.model("List",listSchema); 我做了一份文件 常量列表=新列表({ 名称:“列表1”, 项目:[项目1、项目2、项目3] }); 后来我想添加一个名为item 4的新项目,所以我使用了 List.findOne({name

例如,我有一个模式

 const  listSchema=new mongoose.Schema({
      name:String,
      items:Array
    });

const List=mongoose.model("List",listSchema);
我做了一份文件 常量列表=新列表({ 名称:“列表1”, 项目:[项目1、项目2、项目3] });

后来我想添加一个名为item 4的新项目,所以我使用了

List.findOne({name:list1},function(err,foundList){
foundList.items.push(item4);
foundList.save();
我知道这可能是个愚蠢的问题,但它让我困惑。当我使用
.push
时,我实际上在数组中添加了一个新项,因此现在数组中有4个项。所以问题来了:为什么我使用.save()时,它没有添加4个额外的项目,而是只添加我想要添加的项目4?

insertOne()
允许您将新文档插入到集合中。而
save()。但是,如果您获取了一个现有文档并调用了.save()(就像您在示例中所做的那样)。它只是用您对文档所做的更改来更新文档。现在,
updateOne()
基本上可以让您通过匹配的参数更新现有文档

示例:

insertOne()



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)=>{
})
let newList = new List({
                      name:'list2'
                      items: ['item1','item2','item3'] 
                      })
newList.save();


.save()


您可以通过以下操作创建新文档:

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)=>{
})
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()
             })
insertOne()
允许您将新文档插入到集合中。而
save()。但是,如果您获取了一个现有文档并调用了.save()(就像您在示例中所做的那样)。它只是用您对文档所做的更改来更新文档。现在,
updateOne()
基本上可以让您通过匹配的参数更新现有文档

示例:

insertOne()



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)=>{
})
let newList = new List({
                      name:'list2'
                      items: ['item1','item2','item3'] 
                      })
newList.save();


.save()


您可以通过以下操作创建新文档:

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

但是在findOne中,我已经指定了名称,即list1,那么我还需要使用markModified吗?我不确定save()或insertOne()甚至updateOne()之间的区别,因为在这种情况下,我基本上是在一个字段中添加一个新文档,那么,你能简单地向我解释一下save()的区别和工作原理吗?我在这种情况下使用哪种方法也很重要吗?谢谢你,我真的很感谢你的帮助!您可能混淆了这两个函数。你能给我看一下你的inserOne()代码吗?对不起,我还在学习猫鼬,所以我不知道在这种情况下应该使用哪一种。我看过一个教程,它告诉我如何使用.save()函数,出于好奇,我问了这个问题。所以我没有insertOne()函数的代码。非常感谢你!我更新了我的答案。这有意义吗?或者你还需要更多的例子吗?但是在findOne中,我已经指定了名称,即list1,那么我还需要使用markModified吗?我不确定save()或insertOne()甚至updateOne()之间的区别,因为在这种情况下,我本质上是在其中一个字段中添加一个新文档,那么,你能简单地向我解释一下save()的区别和工作原理吗?我在这种情况下使用哪种方法也很重要吗?谢谢你,我真的很感谢你的帮助!您可能混淆了这两个函数。你能给我看一下你的inserOne()代码吗?对不起,我还在学习猫鼬,所以我不知道在这种情况下应该使用哪一种。我看过一个教程,它告诉我如何使用.save()函数,出于好奇,我问了这个问题。所以我没有insertOne()函数的代码。非常感谢你!我更新了我的答案。这有意义吗?或者你需要更多的例子吗