pymongo操作MongoDB
安装,启动及链接
MongoDB
-
GitHub:https://github.com/mongodb
-
16.04安装:
- 导入MongoDB的GPG key:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
- 创建apt-get源列表:
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
- 更新apt-get源:
sudo apt-get update
- 安装MongoDB:
sudo apt-get install -y mongodb-org
- 导入MongoDB的GPG key:
-
运行:
- 安装完成后运行MongoDB:
mongod --port 27017 --dbpath /data/db
为端口号和数据文件存储路径.运行sudo service mongod start
就行
- 安装完成后运行MongoDB:
-
配置远程连接及用户名密码
- 进入MongoDB命令行:
mongo --port 27017
找不到文件,运行失败:https://www.cnblogs.com/Wang-Y/p/9367936.html - 输入:
use admin
- 输入:
db.createUser({user: 'admin', pwd: 'admin123', roles: [{role: 'root', db: 'admin'}]})
创建了一个用户名为admin,密码为admin123的用户,赋予最高权限 - 修改MongoDB的配置文件,使MongoDB可被远程访问,添加权限认证配置:
sudo vi /etc/mongod.conf
修改net部分添加security内容:
net: port: 27017 bindIp: 0.0.0.0 security: authorization: enabled
- 重启:
sudo service mongod restart
- 进入MongoDB命令行:
-
视化工具
- RoboMongo/Robo 3T,它使用简单,功能强大,官方网站为https://robomongo.org/,下载链接为https://robomongo.org/download
- Studio 3T:简单易用,它同样具有方便的图形化管理界面,官方网站为https://studio3t.com,下载链接为https://studio3t.com/download/
mongo --port 27017
use admin
db.auth("myUserAdmin", "abc123" )
pymongo
-
安装:
pip install pymongo
连接MongoDB,指定数据库,指定集合
import pymongo # 1.导入数据包
client = pymongo.MongoClient('mongodb://user:password@localhost:27017/') # 2.创建连接对象,port默认27017,加上配置的用户名和密码,否则会pymongo.errors.OperationFailure: not authorized on test to execute command
#client = pymongo.MongoClient(host='localhost', port=27017)# 另一种创建连接对象的方式,指定用户和权限方式还不清楚,暂时不推荐
db = client.test # 3.指定数据库
#db = client['test'] # 另一种指定数据库方式
collection = db.students # 4.指定集合,声明了一个Collection对象
#collection = db['students'] # 指定集合另一种方式
插入数据
- 插入一条数据
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
} # 将一条数据以字典形式表示
result = collection.insert_one(student) # insert_one传入字典,返回InsertOneResult对象
print(result.inserted_id) # inserted_id属性获取数据_id,每条数据其实都有一个_id属性来唯一标识。如果没有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性
- 插入多条数据
student1 = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
student2 = {
'id': '20170202',
'name': 'Mike',
'age': 21,
'gender': 'male'
}
result = collection.insert_many([student1, student2]) # insert_many传入列表,列表元素是字典,返回的类型是InsertManyResult
print(result.inserted_ids) # inserted_ids属性获取数据_id列表
查询
普通查询
- find_one()查询得到的是单个结果
result = collection.find_one({'name': 'Mike'})
- 根据ObjectId来查询,需要使用bson库里面的objectid
from bson.objectid import ObjectId
result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})
- find()多条数据的查询,返回Cursor类型,一个生成器对象
results = collection.find({'age': 20})
for result in results:
print(result)
条件查询
- 比较查询
例如:
results = collection.find({'age': {'$gt': 20}}) # 查询年龄大于20的数据
比较符号:
符号 | 含义 | 示例 |
---|---|---|
$lt | 小于 | {'age':{'$lt':20}} |
$gt | 大于 | {'age':{'$gt':20}} |
$lte | 小于等于 | {'age':{'$lte':20}} |
$gte | 大于等于 | {'age':{'$gte':20}} |
$ne | 不等于 | {'age':{'$ne':20}} |
$in | 在范围内 | {'age':{'$in':[20, 23]}} |
$nin | 不在范围内 | {'age':{'$nin':[20, 23]}} |
- 其他条件:
例如:
results = collection.find({'name': {'$regex': '^M.*'}}) # 正则匹配查询
功能符号:
符号 | 含义 | 示例 | 示例含义 |
---|---|---|---|
$regex | 匹配正则表达式 | {'name': {'$regex': '^M.*'}} | name以M开头 |
$exists | 属性是否存在 | {'name': {'$exists': True}} | name属性存在 |
$type | 类型判断 | {'age': {'$type': 'int'}} | age的类型为int |
$mod | 数字模操作 | {'age': {'$mod': [5, 0]}} | 年龄模5余0 |
$text | 文本查询 | {'$text': {'$search': 'Mike'}} | text类型的属性中包含Mike字符串 |
$where | 高级条件查询 | {'$where': 'obj.fans_count == obj.follows_count'} | 自身粉丝数等于关注数 |
详细用法官方文档:https://docs.mongodb.com/manual/reference/operator/query/
计数
统计查询结果有多少条数据可以对查询结果调用count()方法
例如:count = collection.find({'age': 20}).count()
排序
排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志.
例如:results = collection.find().sort('name', pymongo.ASCENDING)
pymongo.ASCENDING指定升序,pymongo.DESCENDING指定降序排列
偏移
skip()方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素
limit()方法指定要取的结果个数
可以配合使用选取结果范围
例如:results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)
更新
- update()方法,指定更新的条件和更新后的数据即可(官方不推荐)
例如:
condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)
-
$set操作符对数据进行更新:
result = collection.update(condition, {'$set': student})
只更新student字典内存在的字段,如果不用$set的话,则会把之前的数据全部用student字典替换 -
update_one()方法,只会找到一条更新
第二个参数不能再直接传入修改后的字典,而是需要使用{'$set': student}这样的形式,其返回结果是UpdateResult类型。调用matched_count和modified_count属性,可以获得匹配的数据条数和影响的数据条数。
例如:
condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 26
result = collection.update_one(condition, {'$set': student})
print(result.matched_count, result.modified_count)
- update_many()方法,则会将所有符合条件的数据都更新
删除
返回目录](#top)
remove()方法指定删除的条件即可,此时符合条件的所有数据均会被删除(官方不推荐)
delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据
例如:
result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count) # deleted_count属性获取删除的数据条数
其他操作
-
组合方法
find_one_and_delete()、find_one_and_replace()和find_one_and_update(),它们是查找后删除、替换和更新操作 -
对索引进行操作
create_index()、create_indexes()和drop_index()等 -
详细用法文档:http://api.mongodb.com/python/current/api/pymongo/collection.html