mongodb增删改查之upsert

7,200次阅读
没有评论

mongodb增删改查之upsert

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

}

admin
版权声明:本站原创文章,由admin2018-05-22发表,共计1446字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)