• 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

    记录完成

  • 相关阅读:
    MQTT 保留消息是什么?如何使用?
    高效数据通道支撑生产情况实时分析与可视化
    MQTT 持久会话与 Clean Session 详解
    规则引擎集成新的可观测性框架
    创建 MQTT 连接时如何设置参数?
    支持高频数采、实时流计算的储能可预测维护系统方案
    如何在 Django 项目中使用 MQTT
    MQTT X v1.8.3 正式发布
    车联网移动场景 MQTT 通信优化实践
    友晶科技FPGA开发板DE10Nano的HDMI彩条实验(二)——TMDS算法
  • 原文地址:https://www.cnblogs.com/ishell/p/4253629.html
Copyright © 2020-2023  润新知