前置知识
如果你已经大致了解了MongoDB的基本概念,请跳到第二节。
MongoDB文档数据库的存储结构分为四个层次,从大到小依次是:
- 数据库database
- 集合collection
- 文档document
- 键值对 key-value pair
数据库由集合组成,集合没有固定的结构,一个集合是一些文档构成的对象。考虑到集合可以插入任意格式和类型的数据,一个集合没有固定的标准,那么就有一个问题:我们该如何得知一个文档该插入哪个集合呢?所以,通常情况下插入集合的数据都会有一定的关联性,以某个主题或者在语义区分。与关系数据库的区别也就仅仅在于集合内的结构了。所以可以说非关系型的数据库(如MongoDB) 玩法更多,使用更灵活。
然后谈谈文档。文档是MongoDB的核心概念,是数据的基本单元,与关系数据库中的行十分类似。文档是一组有序的键值对集合。在同一个集合当中的文档不要求键保持一致,例如,一个集合可能包含用户信息,但每个用户文旦更可以包含不同的信息,如用户名、年龄、电子邮件地址等,而这些字段并不是所有文档都必须具备的。虽然集合不强制要求文档结构,但是数据建模的不同可能会影响程序性能和数据库容量。文档之间的关系是数据建模需要考虑的重要因素。文档与文档之间的关系包括嵌入和引用两种。
文档的数据结构与JSON相同,所有存储在集合中的数据都是BSON格式。(*BSON: Binary JSON)
键值对,键key起到唯一索引的作用,一个键对应一个值,一个值不是指数值而是数据。数据可以是列表list包含着的一组key-value,也可以是单独的string, int, double, char, bool,甚至是png,jpg等等
Create operation
-
插入多个文档
import pymongo client = pymongo.MongoClient(host='localhost', port=27017) db = client.market coll = db.customer docs = [ {"name": "zhao", "age": 20, "gender": "male", "hasCar": False}, {"name": "wang", "age": 33, "gender": "male", "hasCar": True}, {"name": "lu", "age": 23, "gender":"female", "hasCar": True} ] result = coll.insert_many(docs) cursor = coll.find() for doc in cursor: print(doc) client.close()
-
插入单个文档
doc = {"name": "an", age: 24} result = coll.inset_one(doc)
Retrieve operation
-
基本语法:
find({查询条件}, {返回字段}) # 返回字段这里,1表示返回,0表示不返回
-
查看整体信息
import pymongo client = pymongo.MongoClient(host='localhost', port=27017) dblist = client.list_database_names() ### 查看所有数据库信息 print(dblist) # ['admin', 'config', 'items', 'local', 'market'] db = client.market collist = db.list_collection_names() ### 查看当前数据库下所有集合信息 print(collist) # ['users', 'places', 'items', 'customer'] client.close()
-
查看集合内所有文档信息
import pymongo client = pymongo.MongoClient(host='localhost', port=27017) db = client.items coll = db.items cursor = coll.find() for doc in cursor: print(doc) client.close()
-
使用等值条件检索特定信息
import pymongo client = pymongo.MongoClient(host='localhost', port=27017) db = client.market coll = db.customer cursor = coll.find({"age": 14}) # 保存了所有包含这个键值对的文档 # cursor = coll.find({"age": 21, "name": "zhang"}) 也可以使用多个键值对匹配 for doc in cursor: print(doc) client.close()
-
使用比较运算符检索信息
$lt是小于, g t 是大于, gt是大于, gt是大于,gte 大于等于, l t e 小于等于, lte小于等于, lte小于等于,eq等于,$ne不等于.
mongodb当中使用运算符都是以key-value的形式。所以前面的key就要加上匹配符,用法如下:
import pymongo client = pymongo.MongoClient(host='localhost', port=27017) db = client.market coll = db.customer cursor = coll.find({"age": {"$lt": 20}}) # 小于20; for doc in cursor: print(doc) client.close()
-
多个条件的AND检索
cursor = coll.find( {"$and":[{"age":{"$lt": 20}}, {"name":"gao"}]} )
-
多个条件的OR检索
cursor = coll.find( {"$or":[{"age":{"$gt":20}}, {"age":{"$lt": 15}}]} )
-
排序SORT
collection.find().sort('排序参数', 排序顺序) # 排序顺序: 1升序, -1降序
Update operation
-
基本语法
collection.update_one(para1, para2) # 只更新第一个符合目标的 collection.update_many(para1, para2) # 更新所有符合目标的 # para1,para2都是字典且不能省略 # para1表示需要更新的目标 # para2表示更新的内容
-
更新多条数据
target = {"age": {"$lt": 23}} context = {"$set": {"age": 24}} result = coll.update_many(target, context) print("update number:", result.modified_count)
-
替换文档
collection.replace_one(para1, para2) # para1 要替换的目标的值() # para2 被替换的内容 # replace_one只会替换第一个符合条件的文档,但是替换的是全部的文档内容,而非只有para1的内容
-
更新操作符 [本文只做简单概述,不探讨用法和例子]
MongoDB当中还包含了很多更新操作符,这些修饰符可用在更新操作中,例如 db.collection.update_many() 和 db.collection.findAndModify()
基本的使用语法是
{ <operator1>: {<field1>: <value1>, ...}, <operator2>: {<field2>: <value2>, ...}, ... }
字段相关的更新操作符有:
- $currentDate 将字段的值设置为当前日期,可以是日期或时间戳
- $inc 将字段的值按照指定量递增
- $min 仅当指定值小于现有字段值时才更新字段
- $max 仅当指定值大于现有字段值时才更新字段
- $mul 将字段的值乘以指定量
- $rename 重命名字段
- $set 设置文档中字段的值
- $setOnInsert 如果某一更新操作导致插入文档,则设置字段的值,对现有修改文档的更新操作没有影响。
- $unset 从文档中删除指定的字段
阵列相关的操作符
- $ 充当占位符,用于更新与查询条件匹配的第一个元素
- $[] 充当占位符,以更新数组中与查询条件匹配的文档中的所有元素。
- $[] 充当占位符,以更新与查询条件匹配的文档中所有符合
arrayFilters
条件的元素。 - $addToSet 仅向数组中添加尚不存在于该数组的元素。
- $pop 删除数组的第一项或最后一项。
- $pull 删除与指定查询匹配的所有数组元素。
- $push 向数组添加一项。
- $pullAll 从数组中删除所有匹配值。
阵列相关的修饰符
- $each 修改
push
和addToSe
运算符,以在数组更新时追加多个项目。 - $position 修改
push
运算符,以指定在数组中添加元素的位置。 - $slice 修改
push
运算符以限制更新后数组的大小。 - $sort 修改
push
运算符,以对存储在数组中的文档重新排序。
这些操作符具体的用法和例子我会在后面进行更新。
Delete operation
doc = {
"age":{"$gt":29}
}
result = coll.delete_many(doc)
print("delete number:", result.deleted_count)
去重使用distinct方法
collection.distinct('键名')
参考
https://www.cnblogs.com/testlearn/p/15045172.html
https://blog.csdn.net/weixin_44904817/article/details/105975704