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()函数的代码。非常感谢你!我更新了我的答案。这有意义吗?或者你需要更多的例子吗