MongoDB Upsert
介绍
在MongoDB中,upsert是一个用于在任何操作中插入和更新值的方法。换句话说,MongoDB的upsert方法是insert和update的组合(insert + update = upsert)。默认情况下,upsert方法的值总是false。如果文档与指定的查询匹配,并且该方法的值设置为true,则更新操作将更新匹配的文档。如果文档与指定的查询不匹配,并且该方法的值设置为true,则该方法将在集合中插入一个新文档。这个新文档包含指示操作的字段。
语法
upsert: <boolean>
upsert选项的值可以是true或false。
使用findAndModify()函数的upsert
用户可以在findAndModify()函数中使用upsert选项。在该函数中,该选项的默认值是false。如果将该选项的值设置为true,则函数执行以下操作之一:
- 如果找到与给定查询条件匹配的文档,则findAndModify()函数更新该文档。
- 如果没有与给定查询条件匹配的文档,则findAndModify()函数将一个新文档插入到集合中。
语法
db.Collection_name.findAndModify(
{
selection_criteria:<document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ? ]
})
示例:
在这个示例中,我们正在处理
Database: javatpoint
Collection: student
Database: three documents that contain details of students
db.student.find().pretty()
{
"_id" : ObjectID("60353f44f196547db6325eb32"),
"std_name" : "Jhon",
"address" : "England"
"passout" : 2018
}
{
"_id" : ObjectID("60353f44f196547db6325eb33"),
"std_name" : "Mike",
"address" : "Japan"
"passout" : 2019
}
{
"_id" : ObjectID("60353f44f196547db6325eb34"),
"std_name" : "Sam",
"address" : "Australia"
"passout" : 2016
}
现在我们将通过将upsert选项设置为true来在student集合中插入一个新文档。
db.student.findAndModify({query:{name:"Jack"},
update:{$set:{address:"Australia"}},
upsert:true})
在这里,没有与名称”jack”匹配的数据,所以findAndModify()函数插入一个包含两个字段(即”name”和”address”)的新文档,因为upsert方法的值被设置为true。
使用update()函数进行upsert操作
您可以在update()函数中使用upsert选项。在此函数中,该选项的默认值为false。如果将此选项的值设置为true,则该函数执行以下操作之一:
- 如果找到与给定查询条件匹配的文档,则update()函数更新该文档。
- 如果没有与给定查询条件匹配的文档,则update()函数将插入一个新的文档到集合中。
语法:
db.Collection_name.update({Selection_criteria}, {$set : {Update_data}}, {
upsert : <boolean>,
multi : <boolean>,
writeConcern : <document>,
collation : <document>,
arrayFilters : [ <filterdocument1>, . . . ? ],
hint : <document|string>
})
示例:
在这个示例中,我们正在处理
Database: javatpoint
Collection: student
Database: three documents that contain details of students
db.student.find().pretty()
{
"_id" : ObjectID("60353f44f196547db6325eb32"),
"std_name" : "Jhon",
"address" : "England"
"passout" : 2018
}
{
"_id" : ObjectID("60353f44f196547db6325eb33"),
"std_name" : "Mike",
"address" : "Japan"
"passout" : 2019
}
{
"_id" : ObjectID("60353f44f196547db6325eb34"),
"std_name" : "Sam",
"address" : "Australia"
"passout" : 2016
}
现在我们将通过将upsert选项设置为true,在student集合中插入一个新文档。
db.employee.update({name:"Priya"}, {$set: {department: "HR"}},{upsert:true})
这里,没有与名称“Noah”匹配的数据,因此update()函数将插入一个包含两个字段(即,“name”和“address”)的新文档,因为upsert方法的值被设置为true。
使用运算符表达式进行插入和更新
如果一个文档不匹配给定的数据,并且upsert选项的值设置为true,则更新操作会根据查询参数中的相似性子句创建新的文档,并应用更新参数中的表达式。
示例:
在这个示例中,我们正在处理
Database: javatpoint
Collection: employee
Database: four documents that contain details of employees
> db.employee.find().pretty()
{
"_id" : ObjectID("60545245fa51254k5634hg412")
"Employee_ID" : "125"
"Name" : "Nick"
"Phone Number" : "6267896546"
}
{
"_id" : ObjectID("60545245fa51254k5634hg413")
"Employee_ID" : "129"
"Name" : "John pie"
"Phone Number" : "6965453164"
}
{
"_id" : ObjectID("60545245fa51254k5634hg414")
"Employee_ID" : "135"
"Name" : "Jack"
"Phone Number" : "7516584359"
}
{
"_id" : ObjectID("60545245fa51254k5634hg415")
"Employee_ID" : "140"
"Name" : "Thomas"
"Phone Number" : "9654778546"
}
db.employee.update({Name: "Hnery"}, // Query parameter
{set: {Phone Number: '9654785423 '}, // Update documentsetOnInsert: {Gender: 'Male'}},
{upsert: true})
在这里,update() 方法根据查询条件创建一个新文档,其字段为 “Name : Hnery”,然后将 set 和setOnInsert 操作应用于此文档。