MongoDB的upsert状态判断和pymongo使用方法-创新互联

在mongo中,有一个命令非常的方便,就是upsert,顾名思义就是update+insert的作用MongoDB的upsert状态
判断和pymongo使用方法

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

10年积累的成都做网站、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有枞阳免费网站建设让你可以放心的选择与我们合作。

upsert的使用方法:

MongoDB shell version: 2.4.9
connectingto: test
> use date
switchedto 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-8import 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 & Savedb.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})

# Updatedb.users.update({'name':'user1'}, {'$set': {'age': 20}})
json= {
'age':20
}
db.users.update({'name':'user2'}, {'$set': json})

# Upsertdb.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

记录完成


文章标题:MongoDB的upsert状态判断和pymongo使用方法-创新互联
网页地址:http://azwzsj.com/article/dgcsgj.html