pymongo操作MongoDB

pymongo操作MongoDB

安装,启动及链接

MongoDB

返回目录

  • 官方网站:https://www.mongodb.com

  • 官方文档:https://docs.mongodb.com

  • GitHub:https://github.com/mongodb

  • 中文教程:http://www.runoob.com/mongodb/mongodb-tutorial.html

  • 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:mongod --port 27017 --dbpath /data/db为端口号和数据文件存储路径.运行sudo service mongod start就行
  • 配置远程连接及用户名密码

    • 进入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
  • 视化工具

    mongo --port 27017
    use admin
    db.auth("myUserAdmin", "abc123" )

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属性获取删除的数据条数

其他操作

原文地址:https://www.cnblogs.com/Wang-Y/p/9371882.html