借助pymongo实现mongo的基本操作

1. 引入依赖

1
2
import pymongo
from pymongo import MongoClient

2. 建立连接

开始第一步就是连接mongodb,有两种常见的连接方式

方式一

1
2
uri = "mongodb://user:password@localhost:port/the_database?authMechanism=SCRAM-SHA-1"
client = MongoClient(uri)

方式二

1
2
3
4
5
6
client = MongoClient('localhost',
port = 27017,
username='user',
password='password',
authSource='the_database',
authMechanism='SCRAM-SHA-1')

说明

MongoDB 3.0(对应pymongo2.8)之后默认使用“SCRAM-SHA-1”加解密;之前使用的是“MONGODB-CR”,可以使用authMechanism指定;同时可以使用authSource指定应用加解密的database,默认是admin。

3. 获取db

指定操作的db,然后接下来就可以对db中的集合进行操作

1
2
db = client['db_name']
# db = client.db_name # 也可以

4. 集合操作

a. 插入数据

1
2
3
4
5
6
7
8
9
import datetime

post = {"author": "Mike",
"text": "My first blog post!",
"count": 12345,
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}

post_id = db['test_collection'].insert_one(post).inserted_id

上面这个每执行一次,插入一个document,对于批量插入,可以使用 insert_many 函数,传入一个列表的参数即可

b. 查询

利用 find_one 查找一条匹配的文档

1
2
record = db['test_collection'].find_one()
print(record)

如果需要排除查询文档中某些字段,可以通过设置field的值为0,

1
2
record = db['test_collection'].find_one({}, {"_id": 0})
print(record)

根据查询条件进行检索,可以如下使用

1
2
record = db['test_collection'].find_one({"author": "Mike"}, {"_id": 0})
print(record)

or查询

第一个参数,可以使用 { '$or': [ 查询条件, 查询条件 ] }

1
2
record = db['test_collection'].find_one({'$or': [{"author": "Mike"}, {"author": "Jake"}], {"_id": 0})
print(record)

and与or查询

字典中的不同的key组合就是and,基本语法为 db.col.find({key1:value1, key2:value2}).pretty()

1
2
record = db['test_collection'].find_one({count: 12345, '$or': [{"author": "Mike"}, {"author": "Jake"}], {"_id": 0})
print(record)

数字比较

不同于mysql直接使用符号,对于比较会用形如$lt的符号来代替

操作 格式 实例 等效sql
等于 {key: value} db['test_collection].find_one({'count': 123}) count=123
小于 {key: {'$lt': value}} db['test_collection].find_one({'count': {'$lt': 123} }) count<123
小于或等于 {key: {'$lte': value}} db['test_collection].find_one({'count': {'$lte': 123} }) count<=123
大于 {key: {'$gt': value}} db['test_collection].find_one({'count': {'$gt': 123} }) count>123
大于或等于 {key: {'$gte': value}} db['test_collection].find_one({'count': {'$gte': 123} }) count>=123
不等于 {key: {'$ne': value}} db['test_collection].find_one({'count': {'$ne': 123} }) count!=123

c. 更新

更新提供了两种方式,一个是增量更新,一个是覆盖更新

增量更新update

语法定义如下

1
2
3
4
5
6
7
db.collection.update(
<query>, # 查询条件
<update>, # 更新的值
{
upsert: <boolean> # 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
}
)

一个实际的更新case

1
mycol.update_one({'author': 'Mike'}, {'$set': { 'text': 'hello', 'date': datetime.datetime.now()}})

覆盖更新save

语法定义如下

1
db.collection.save({document})

这个表示用document的内容来替换已有文档,从接口签名上来看,不推荐使用这种方式

d. 删除

和查询的使用方式差不多,只不过最终的效果是删除而已

1
db.collection.delete_one({query})

实例如下

1
mycol.delete_one({'author': 'Mike'})

II. 其他

0. 参考

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals