zoukankan      html  css  js  c++  java
  • MongoDB的upsert状态判断和pymongo使用方法

    在mongo中,有一个命令非常的方便,就是upsert,顾名思义就是update+insert的作用

    根据条件判断有无记录,有的话就更新记录,没有的话就插入一条记录

    upsert的使用方法:

    MongoDB shell version: 2.4.9
    connecting to: test
    > use date
    switched to db date
    > db.user.insert({"name":"user1", "age":12, "sex":"male"})
    > db.user.insert({"name":"user2", "age":13, "sex":"male"})
    > db.user.insert({"name":"user3", "age":14, "sex":"male"})
    > db.user.find()
    { "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 12, "sex" : "male" }
    { "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
    { "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
    > db.user.update({"name":"user1"}, {"$set":{"age":21}}, {"upsert":"true"})
    > db.user.find()
    { "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 21, "sex" : "male" }
    { "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
    { "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
    > db.user.update({"name":"user1"}, {"$set":{"age":21}, "$setOnInsert":{"sex":"female"}}, {"upsert":"true"})
    > db.user.find()
    { "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 21, "sex" : "male" }
    { "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
    { "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
    > db.user.update({"name":"user4"}, {"$set":{"age":21}, "$setOnInsert":{"sex":"female"}}, {"upsert":"true"})
    > db.user.find()
    { "_id" : ObjectId("54c75876662ee1617463f0a3"), "name" : "user1", "age" : 21, "sex" : "male" }
    { "_id" : ObjectId("54c75880662ee1617463f0a4"), "name" : "user2", "age" : 13, "sex" : "male" }
    { "_id" : ObjectId("54c7588d662ee1617463f0a5"), "name" : "user3", "age" : 14, "sex" : "male" }
    { "_id" : ObjectId("54c75a07478a805237d087c3"), "name" : "user4", "age" : 21, "sex" : "female" }
    > 

    上面的代码可以看出,$set搭配$setOnInsert使用就可以实现更新和插入时的一些事件了。

    比如实现更新数据,如果一些需要更新的,就用$set设置,如果有些如创建日期这种字段,那么使用$setOnInsert更新

    相当方便,如果想知道刚才执行的upsert是更新还是插入,使用如下的方法即可(如下代码在上面的代码数据基础之上)

    > db.user.update({"name":"user4"}, {"$set":{"age":21}, "$setOnInsert":{"sex":"female"}}, {"upsert":"true"})
    > db.runCommand('getlasterror')
    {
        "connectionId" : 35,
        "updatedExisting" : true,
        "n" : 1,
        "syncMillis" : 0,
        "writtenTo" : null,
        "err" : null,
        "ok" : 1
    }
    > db.user.update({"name":"user5"}, {"$set":{"age":21}, "$setOnInsert":{"sex":"female"}}, {"upsert":"true"})
    > db.runCommand('getlasterror')
    {
        "connectionId" : 35,
        "updatedExisting" : false,
        "upserted" : ObjectId("54c75caa478a805237d087c4"),
        "n" : 1,
        "syncMillis" : 0,
        "writtenTo" : null,
        "err" : null,
        "ok" : 1
    }
    > 

    上面的updatedExisting 就可以反馈刚才的状态,true为更新操作,false为插入操作

    当upsert为插入操作还可以返回ObjectId呢,是不是很方便~

    其实上面的操作都是在mongo中直接操作的,很多时候更新数据都是使用脚本,以python为例

    代码还是稍微有点不同的

    pymongo

    #!/bin/env python
    #encoding:utf-8
    import os
    import pymongo
    
    DATA_DIR = 'data'
    
    # 连接数据库
    conn = pymongo.Connection('127.0.0.1', 27017)
    #conn = pymongo.Connection('115.28.55.217', 27017)
    db = conn.haha
    
    
    db.users.remove()
    
    # Insert & Save
    db.users.insert({'name': 'user1', 'age': 16, 'index': 1})
    db.users.insert({'name': 'user2', 'age': 17, 'index': 2})
    db.users.insert({'name': 'user3', 'age': 18, 'index': 3})
    db.users.save({'name': 'user4', 'age': 19, 'index': 4})
    
    # Update
    db.users.update({'name':'user1'}, {'$set': {'age': 20}})
    json = {
            'age':20
    }
    db.users.update({'name':'user2'}, {'$set': json})
    
    # Upsert
    db.users.update({'name':'user5'}, {'$set': {'age': 22}, '$setOnInsert': {'index':5}}, upsert=True)
    
    json = {
            'age':36
    }
    name = 'user5'
    db.users.update({'name':name}, {'$set': json, '$setOnInsert': {'index':5}}, upsert=True)

    因为python中不认识true,所以使用True,并且为了代码的可读性,建议使用upsert=True

    当然,pymongo中的返回信息也是有区别的。

    并不是db.runCommand('getlasterror')而是db.command('getlasterror')

    那么使用如下代码就可以获取刚才update的类型了

    status = db.command('getlasterror')['updatedExisting']
    print status

    记录完成

  • 相关阅读:
    vue-递归 组件嵌套组件循环 附加:(项目中可以用form来提交 或者 v-model 绑定的提交)
    Vue-开卡充值 -轮询
    bootstrap3 三级下拉菜单
    【UOJ #50】【UR #3】—链式反应(生成函数+分治NTT/多项式Exp+常微分方程)
    【CSP-S 2019模拟】题解
    【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)
    【LOJ #2264】「CTSC2017」吉夫特(Lucas定理+Dp)
    【LOJ #3120】「CTS2019 | CTSC2019」珍珠(生成函数+NTT)
    【LOJ #2541】「PKUWC2018」猎人杀(容斥+分治NTT)
    【LOJ #2346】「JOI 2016 Final」断层(线段树)
  • 原文地址:https://www.cnblogs.com/ishell/p/4253629.html
Copyright © 2011-2022 走看看