基本介绍
mongodb是由c++编写的的一种面向文档的非关系型数据库,以键值对的方式存储,结构不固定灵活易存储。类似Json对象。而mongodb使用的数据结构是BSON(二进制json),提高了存储和扫描效率。
在python中使用
# py通过pymongo操作mongodb
pip install pymongo
连接mongodb
import pymongo
import urllib.parse
# 无密码连接
client = pymongo.MongoClient(host="localhost", port="27017")
"""
client = pymongo.MongoClient('mongodb://localhost:27017')
"""
# 有密码连接
client = pymongo.MongoClient(host="localhost", port="27017")
mongo_auth = client.admin
mongo_auth.authenticate(username, password)
"""
user = urllib.parse.quote_plus(username)
pwd = urllib.parse.quote_plus(password)
client = pymongo.MongoClient('mongodb://%s:%s@localhost:27017' % (user, pwd))
"""
client.server_info() # 判断是否连接成功
指定数据库
db = client.test
# db = client["test"]
指定集合
"""
mongodb的集合相当于关系型数据库中的表
"""
collection = db.demo
# collection = db["demo"]
插入单条数据
import datetime
data = {
"name": "xiaoming",
"msg": "shi yi ge xue sheng"
"date": datetime.datetime.now()
}
collection.insert_one(data)
插入多条数据
import datetime
data_list = []
for name in ["xiaoming", "xiaoli"]:
data = {
"name": name,
"msg": "shi yi ge xue sheng",
"date": datetime.datetime.now()
}
data_list.append(data)
collection.insert_many(data_list)
删除一条数据
collection.delete_one({"name":"xiaoming"})
# 如果删除条件匹配到多条数据,默认只删除第一条数据
删除多条数据
collection.delete_many({"msg":"shi yi ge xue sheng"})
更新单条数据
data = {
"name": "xiaoming",
"msg": "He is a teacher",
"date": datetime.datetime.now()
}
update_condition = {"name": "xiaoli"}
collection.update_one(update_condition, {"$set":data})
更新多条数据
data = {
"name": "xiaohong",
"msg": "She is a girl",
"date": datetime.datetime.now()
}
update_condition = {"name": "xiaoming"}
collection.update_many(update_condition, {"$set":data})
# 更新时,若无满足条件则插入数据
collection.update_many(update_condition, {"$set":data}, upsert = True)
查询一条数据
find_condition = {
"name": "xiaoming"
}
find_result = collection.find_one(find_condition)
# 根据projection 参数来指定需要查询的字段
result = collection.find_one(find_condition, projection={
"_id":True, "name":True, "msg":True
})
查询多条数据
# 这样查询返回结果类型时cursor,需要迭代得到每个结果为dict
find_condition = {
"name": "xiaoming"
}
result_cursor = collection.find(find_condition)
for result in result_cursor:
print(result)
时间范围查询
find_condition = {
"date": {
"$gte": datetime.datetime(2022,3,18), "$lt": datetime.datetime(2022,3,21)
}
}
# 查询时间范围在18号到21号之前的数据
result = collection.find_one(find_condition)
数据通过 _id来查询
from bson.objectid import ObjectId
query_id_str = "xxxxxxxxxxxxxxxx"
find_condition = {
"_id": ObjectId(query_id_str),
}
# _id提供的是str类型,需要转换为ObjectId类型
result = collection.find_one(find_condition)
查询一条数据并且删除
find_condition = {
"name": "xiaoli"
}
deleted_data = collection.find_one_and_delete(find_condition)
# 使用sort参数
deleted_data = collection.find_one_and_delete(find_condition, sort = [("index", pymongo.DESCENDING)])
创建索引
# 自定义索引, unique为true是唯一索引
collection.create_index("name", unique = True)
获取/删除索引
index_name = collection.index_information()
"""
index_list = collection.list_indexes()
for index in index_list:
print(index)
"""
# 可以看到获取索引有两个方法,index_information/list_indexes
# 删除
index_del = collection.drop_index("name")
计数
find_condition = {
"name": "xiaohong"
}
result_count = collection.count_documents(find_condition)
# 注意 count_documents 方法需要py版本3.7及其以上