• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

mongodb增删改查之upsert

Sql admin 1年前 (2018-05-22) 3604次浏览 0个评论 扫描二维码

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

}


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mongodb 增删改查之 upsert
喜欢 (1)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!