pymongo基本操作

知道了大概的mongodb命令后,再下载Mongodb的python驱动,sudo pip3 install pymongo ,然后在python文件中导入相应的库,进行如下的配置:

1
2
3
4
5
6
7
from pymongo import MongoClient
_client = MongoClient('127.0.0.1', 27017) #主机IP,Port
#先创建一个名为Mongodb的数据库,再连接到此数据库
_db = _client['Mongodb']
_db.authenticate('username', 'password')#如果是设置了密码登陆时
test = _db['test'] # 表名
femn = _db['femn']

返回结果

insert , insert_one , insert_many

1
2
3
4
5
insert({'name':1}) # <class 'bson.objectid.ObjectId'>
insert([{'name':1},{'name':2}]) # [ObjectId('xx'),ObjectId('xx')]
insert_one # r.inserted_id <class 'bson.objectid.ObjectId'>
insert_many # <class 'pymongo.results.InsertManyResult'>
print(r.inserted_ids) # list [ObjectId('xx'), ObjectId('xx')]

update

1
{'ok': 1, 'updatedExisting': True, 'nModified': 1, 'n': 1}

upsert=True

1
{'ok':1,'nModified':0,'upserted':ObjectId(''),'n':1,'updatedExisting':True}

update_one

1
2
3
r = db.test.update_one({'_id':'xx'},{'$set':{'name':'femn'}})
# <pymongo.results.UpdateResult object at 0x7f9cb2ebaaf8>
r.raw_result ={'nModified': 0, 'n': 1, 'updatedExisting': True, 'ok': 1}

delete_many delete_one

1
2
3
4
result = db.test.delete_many({'x': 1}) #pymongo.results.DeleteResult
result.deleted_count # 2
result.raw_result # {'n': 2, 'ok': 1}
#n表示匹配成功删除的个数 和delete_one是一样的

find find_one

1
2
3
find() find({}) # return 一个pymongo.cursor.CursorType
find_one({'_id':'xx'}) # return dict 如果没有则返回None
find_one_and_update() # return dict

find find_one 命令

1
2
3
4
5
6
femn.find(filter={'field':'xx'},
projection={'mobile':1,'name':0},limit=10,skip=0,
sort=[('update_time':pymongo.DESCENDING)])
femn.find({'name':xx},{'name':1}).limit().skip().
sort=([('update_time':pymongo.DESCENDING)])

filter中的多个查询操作符

$all $in $nin 此字段可包含(或排除)多个值的文档

1
2
3
4
5
({filed:{'$all':[]}})
# 这个字段是数组并满足这个数组的值和指定的相同的文档
({filed:{'$in','$nin' :['x']}})
# 而这个只表示'x'在字段不管是数组类型的值,还是字符串类型的值,只要有这个'x'的文档就行

$regex 正规匹配字段的值

1
2
({filed:{'$regex': '%s' % student_name}}) 就是 ' *%s* '
({filed:{'$not':{'$regex':'femn'}}})

$exists 判断文档是否有此字段

1
2
({filed: {'$exists': False}})
#得到所有不存在flag字段的文档 可取True

$or 满足一个字段的值就行

1
2
({'gender': '女', '$or': [{'expand.expand_time': '2015-01-01'},
{'coin': {'$lt': 2}}]})

$slice

1
2
({'expand.expand_time':{'$slice':[5,3]}})
# 不是分片,去掉前5个后,再取3个 ,-5时去掉后5个取,取最后3个

混合包含和排除不能同时用

1
({'album_id':{'$in':[i]}},projection={'play_count':1,'cover_image':1})

混合包含和排除不能同时用,既in:[],cover_image:1,comment:0不能同时使用,但可以 in:[],cover_image:1,comment:1

其它的查询操作符 $eachMatch,$gt:2, $lte, $gte, $lt, ‘$slice’ $ne不等于

find_one_and_update命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
find_one_and_update(q,u,p,upsert=False,
return_document=ReturnDocument.AFTER)
test.update({'name':'femn'},
{
# update中的多个更新操作符
'$set':{'name':'xx'},
# 改变某个字段的值
'$inc':{'age':-1},
# 增加或减少 一个字段内容是数值的值
'$addToSet':{'name_list':{'$each':['','']}},
# 往一个数组的字段,添加不一样的内容,可避免反复添加
# $each 一次性增加多个值
# $push 往一个数组的字段中,可重复的添加一样的内容
'$pull':{'list':{'key':'value'}},
# 删除数组中 所有key为value的数组都会删除掉 将所有匹配到的数据都删除
'$pullAll':{'l':[1,2,3]}
# 一次性删除多个数组
})
test.update({'_id':id},{'$set':
{'recording':{'openid':openid,'book_id':book_id}}})
# recording 是一个Object类型
test.find_one({'_id':bookcase_id,recording.book_id':book_id})

改变数值中的值 通过位置或者操作符$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 通过$
test.update({"relationships.fname":"xiong",'_id':id},
{$set:{"relationships.$.age":22}})
# 通过位置用来定位查询文档已匹配的元素,并进行更新
test.update({'_id':id},
{'$inc':{'book_class.'+str(i)+'.class_count':count}})
# 指定一个数组中的一个字段改变
test.update({'_id':id},
{'activity_history':{'click_total':1,per:1,'login':1}}})
# 此方法不行 换成如下方法
test.update({'_id':id},
{'$inc':{'activity_history.0.click_total':1,
'activity_history.0.2017-02':1,
'activity_history.0.login':1}},)

注意pull一个个的数组是个整体

1
2
3
4
5
6
7
'reservation_list':[{'time':"",'device_id':'',
'order_book':[{1},{2}]},{...},{...}]
# 错误的设计 不可能单独的删除order_book中的1,2还保留着...
# 它会删除整个的那个数组reservation_list
'reservation_list':[{'device_id':'','book_id':'',
'book_plu':'','shelf_number':101}]
# 所以要将order_book中保存的信息,放出来

数组字段的内容album_id = ['1','xx'],不是JSON类型

1
2
3
4
test.update({'_id':id},{'$pull':{'album_id':'xx'}})
# album_id必须是数组
{'$pull': {'album_id': {'$in': ['xx']}}
#也可以使用其它的查询操作符 $gt

删除以字典形式保存的数组

1
2
{'$pull': {'praise': {'user_id': user_id,'_id':'xx'}}
{'$pull': {'save_receiver_address': {'flag': del_flag}}})

Share Comments