python MongoDB

给你一囗甜甜゛ 提交于 2020-01-17 15:31:15

MongoDB官网下载地址
https://www.mongodb.com/download-center/community
1 连接
安装pymongo

pip install pymongo

连接MongoDB

from pymongo import MongoClient
from datetime import datetime
conn=MongoClient('localhost',27017)
db=conn.Student
table=db.student
#删除所有age大于10的数据
table.delete_many({"age":{"$gt":10}})
stu=[{"name":"1","age":30},{"name":"2","age":30},{"name":"3","age":30},{"name":"4","age":30}]
table.insert_many(stu)
table.insert_one({"name":"chen","age":29})
table.update_one({"name":"chen"},{"$set":{"name":"chenxu","age":29}},upsert=True)


data=db.Data
from tzlocal import get_localzone
tz=get_localzone()
print(data.index_information())
data.insert_one({"date":datetime.now(tz)})
# data.drop_index("date_1")
# data.create_index("date",expireAfterSeconds=30)

for i in table.find():
    print(i['name'])

插入数据
在 MongoDB 中,每条数据其实都有一个 _id 属性作为唯一标识。如果没有显式指明该属性,MongoDB 会自动产生一个 ObjectId 类型的 _id 属性,insert() 方法会在执行后返回 _id 值。不过在 PyMongo 3.x 版本中,官方已经不推荐使用 insert() 方法,而是推荐使用insert_one() 和 insert_many() 方法来分别插入单条记录和多条记录。

#要插入到集合中的对象
book = {
      'name' : 'Python基础',
      'author' : '张三',
      'page' : 80
}
collection=db.Book
#向集合中插入一条记录
collection.insert_one(book)
#返回结果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}
#对于insert_many()方法,我们可以将数据以列表形式传递参数
book1 = {
      'name' : 'Java基础',
      'author' : '李白',
      'page' : 100
}
book2 = {
      'name' : 'Java虚拟机',
      'author' : '王五',
      'page' : 100
}

# 创建 book_list 列表
book_list = [book1, book2]

# 向集合中插入多条记录
collection.insert_many(book_list)
# 返回结果:<pymongo.results.InsertManyResult object at 0x7f80a39fa408>

数据查询
查询需要使用 find_one() 或 find() 方法,其中 find_one() 查询得到的是单个结果,即一条记录,find() 则返回一个生成器对象。下面我们就来查询上面刚插入的数据,如果查询不到数据则返回 None ,代码如下:

# 通过条件查询一条记录,如果不存在则返回None
res = collection.find_one({'author': '张三'})
print (res)
# 打印结果:{'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}

# 通过条件查询多条记录,如果不存在则返回None
res = collection.find({'page': 100})
print (res)
#打印结果:<pymongo.cursor.Cursor object at 0x7f80a39daa58>

# 使用 find() 查询会返回一个对象
# 遍历对象,并打印查询结果
for r in res:
   print(r)
#打印结果:
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 100}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 100}

# 查询page大于50的记录
res = collection.find({'page': {'$gt': 50}})
# 通过遍历返回对象,结果如下:
# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 80}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 100}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 100}

上面查询条件中我们用到了 $gt 的比较运算符,关于查询条件中的比较运算符和功能运算符对照表如下:

符号 含义 举例
$gt 大于 {‘page’: {’$gt’: 50}
$lt 小于 {‘page’: {’$lt’: 50}
$lte 小于等于 {‘page’: {’$lte’: 50}
$gte 大于等于 {‘page’: {’$gte’: 50}
$ne 不等于 {‘page’: {’$ne’: 50}
$in 在范围内 {‘page’: {’$in’: [50, 90]}}
$nin 不在范围内 {‘page’: {’$nin’: [50, 100]}}
$regex 匹配正则表达式 {‘name’: {’$regex’: ‘^张.*’}}
$exists 属性是否存在 {‘name’: {’$exists’: True}}
$type 类型判断 {‘name’: {’$type’: ‘string’}}
$mod 数字模操作 {‘page’: {’$mod’: [80, 10]}}
$text 文本查询 {‘KaTeX parse error: Expected '}', got 'EOF' at end of input: text': {'search’: ‘Java’}}
$where 高级条件查询 {’$where’: ‘obj. author == obj. full_name’}

数据的更新操作
更新操作和插入操作类似,PyMongo 提供了两种更新方法,即 update_one() 和 update_many() 方法,其中 update_one() 方法只会更新满足条件的第一条记录。

注意:

如果使用 $set,则只更新 book 对象内存在的字段,如果更新前还有其他字段,则不更新也不删除。
如果不使用 $set,则会把更新前的数据全部用 book 对象替换,如果原本存在其他字段则会被删除。

# 查询一条记录
book = collection.find_one({'author': '张三'})
book['page'] = 90

# 更新满足条件{'author', '张三'}的第一条记录
res = collection.update_one({'author': '张三'}, {'$set': book})

# 更新返回结果是一个对象,我们可以调用matched_count和modified_count属性分别获得匹配的数据条数和影响的数据条数。
print(res.matched_count, res.modified_count)
#打印结果:1 1

# 更新满足条件 page>90 的所有记录,page 字段自加 10
res = collection.update_many({'page': {'$gt': 90}}, {'$inc': {'page': 10}})

# 打印更新匹配和影响的记录数
print(res.matched_count, res.modified_count)
#打印结果:2 2

book3 = {'name':'Python高级', 'author':'赵飞', 'page': 50}

#upsert=True表示如果没有满足更新条件的记录,则会将book3插入集合中
res = collection.update_one({'author': '赵飞'}, {'$set': book3}, upsert=True)
print(res.matched_count, res.modified_count)
#打印结果:0 0

# 查询所有记录,并遍历打印出来
res = collection.find()
for r in res:
   print(r)
#打印结果:
# {'_id': ObjectId('5de4c7b90ae08431839ac2a7'), 'name': 'Python基础', 'author': '张三', 'page': 90}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a8'), 'name': 'Java基础', 'author': '李白', 'page': 110}
# {'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 110}
# {'_id': ObjectId('5de4d76f71aa089d58170a92'), 'author': '赵飞', 'name': 'Python高级', 'page': 50}

集合的删除操作
删除数据同样推荐使用两个方法 delete_one() 和 delete_many() ,其中 delete_one() 为删除第一条符合条件的记录。具体操作代码如下:

# 删除满足条件的第一条记录
result = collection.delete_one({'author': '张三'})
# 同样可以通过返回对象的 deleted_count 属性查询删除的记录数
print(result.deleted_count)
# 打印结果:1

# 删除满足条件的所有记录,以下为删除 page < 90 的记录
result = collection.delete_many({'page': {'$lt': 90}})
print(result.deleted_count)
# 打印结果:1

其他数据库操作
除了以上标准的数据库操作外,PyMongo 还提供了以下通用且方便的操作方法,比如 limit() 方法用来读取指定数量的数据skip() 方法用来跳过指定数量的数据等,具体请看如下代码:

# 查询返回满足条件的记录然后删除
result = collection.find_one_and_delete({'author': '王五'})  
print(result)
# 打印结果:{'_id': ObjectId('5de4c8ae0ae08431839ac2a9'), 'name': 'Java虚拟机', 'author': '王五', 'page': 110}

# 统计查询结果个数
# 全部结果个数
collection.find().count()
# 返回结果:1

# 满足条件结果个数
collection.find({'page': 100}).count()
# 返回结果:0

# 查询结果按字段排序
# 升序
results = collection.find().sort('page', ASCENDING)

# 降序
results = collection.find().sort('page', DESCENDING)

# 下面查询结果是按page升序排序,只返回第二条记录及以后的两条结果
results = collection.find().sort('page', ASCENDING).skip(1).limit(2)
print(results)

时间索引:
时间索引可以设置记录的存活时间

db.data.create_index("date",expireAfterSeconds=30)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!