共计 1446 个字符,预计需要花费 4 分钟才能阅读完成。
upsert是一种特殊的更新方式,要是没有找到符合条件的文档,则会自动创建一个文档,否则更新对应的文档数据。
看mongodb权威指南提到upsert会避免竞态问题,如果使用日常的思维去考虑这个问题,需要先去数据库中查找符合条件的文档,然后再根据更新信息更新数据,这个在多线程或者多进程的情况下产生资源竞争的情况,使用upsert可以很好的避免这种情况的发生。
下面开始演示一下upsert的用法
原始数据
{
“_id” : ObjectId(“5afd34052c63ae1a943bdb27”),
“name” : “hello”,
“friends” : 34.0,
“enemies” : 2.0,
“favor” : [
“2”,
“3”,
“4”,
“6”,
“7”,
“8”,
“9”,
“10”,
“1”
]
}
{
“_id” : ObjectId(“5afd347c2c63ae1a943bdb29”),
“name” : “joe”,
“friends” : 34.0,
“enemies” : 4.0
}
//db.test.update({“name”:25},{“$inc”:{“friends”:3}},true)
{
“_id” : ObjectId(“5afd34052c63ae1a943bdb27”),
“name” : “hello”,
“friends” : 34.0,
“enemies” : 2.0,
“favor” : [
“2”,
“3”,
“4”,
“6”,
“7”,
“8”,
“9”,
“10”,
“1”
]
}
{
“_id” : ObjectId(“5afd347c2c63ae1a943bdb29”),
“name” : “joe”,
“friends” : 34.0,
“enemies” : 4.0
}
{
“_id” : ObjectId(“5b042463c42e07823911338e”),
“name” : 25.0,
“friends” : 3.0
}
如果继续执行上一个语句,则会对当前的数据更新,因为已经存在对应的文档了。
关于更新默认情况下更新只对符合条件的第一个文档执行操作,要是有多个文档要更新,则需要将update的第四个参数设置为true,这样才能实现多个文档的更新。
db.test.update({“friends”:34},{“$set”:{“mul”:1}},false,true)
得到的结果如下
{
“_id” : ObjectId(“5afd34052c63ae1a943bdb27”),
“name” : “hello”,
“friends” : 34.0,
“enemies” : 2.0,
“favor” : [
“2”,
“3”,
“4”,
“6”,
“7”,
“8”,
“9”,
“10”,
“1”
],
“mul” : 1.0
}
{
“_id” : ObjectId(“5afd347c2c63ae1a943bdb29”),
“name” : “joe”,
“friends” : 34.0,
“enemies” : 4.0,
“mul” : 1.0
}
{
“_id” : ObjectId(“5b042463c42e07823911338e”),
“name” : 25.0,
“friends” : 3.0
}