MongoDB Upsert
在 MongoDB 中,upsert 是一种用于在任何操作中插入和更新值的方法。换句话说,MongoDB upsert 方法是插入和更新的组合(插入 + 更新 = upsert)。默认情况下,upsert 方法的值始终为 false。如果文档与指定的查询匹配并且方法的值设置为 true,则更新操作将更新匹配的文档。如果文档与指定的查询不匹配并且方法的值设置为 true,则此方法会在集合中插入一个新文档。此新文档包含指示操作的字段。
MongoDB Upsert 语法:
upsert: <boolean>
upsert 选项的值将是 true 或 false。
使用 findAndModify() 函数更新插入:
用户可以将 upsert 选项与 findAndModify() 函数结合使用。在此函数中,选项的默认值为 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: yiidian
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 来在学生集合中插入一个新文档。
db.student.findAndModify({query:{name:"Jack"},
update:{$set:{address:"Australia"}},
upsert:true})
在这里,没有数据与名称“jack”匹配,因此 findAndModify() 函数插入一个包含两个字段(即“name”和“address”)的新文档,因为 upsert 方法的值设置为 true。
使用 update() 函数更新插入:
您可以将 upsert 选项与 update() 函数结合使用。在此函数中,选项的默认值为 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: yiidian
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 来在学生集合中插入一个新文档。
db.employee.update({name:"Priya"}, {$set: {department: "HR"}},{upsert:true})
在这里,没有数据与名称“Noah”匹配,因此 update() 函数插入一个包含两个字段(即“name”和“address”)的新文档,因为 upsert 方法的值设置为 true。
使用运算符表达式进行更新插入:
如果文档与给定数据不匹配并且 upsert 选项的值设置为 true,则更新操作会根据给定查询参数中的相似性子句创建新文档,并应用更新参数中的表达式。
例如:
在这个例子中,我们正在使用
Database: yiidian
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"
}
现在我们将通过将 upsert 选项的值设置为 true 来在Employees 集合中插入一个新文档。
db.employee.update({Name: "Hnery"}, // Query parameter
{$set: {Phone Number: '9654785423 '}, // Update document
$setOnInsert: {Gender: 'Male'}},
{upsert: true})
在这里,update() 方法根据查询条件创建一个带有字段“Name : Hnery”的新文档,然后对该文档应用 $set 和 $setOnInsert 操作。
热门文章
优秀文章