⭐ 简介:大家好,我是zy阿二,我是一名对知识充满渴望的自由职业者。
☘️ 最近我沉溺于Python的学习中。你所看到的是我的学习笔记。
❤️ 如果对你有帮助,请关注我,让我们共同进步。有不足之处请留言指正!

系列文章传送门,建议循序渐进的学习:

1. MongoDB入门安装 & 用Pycharm可视化链接MongoDB。入门篇

2. 用Pycharm熟悉Mongodb命令,增删改查基本操作。基础篇

3. 用pymongo库实现Python对MongoDB的深度操作。毕业篇【本文】

1. 先看下 MongoDB 命令和 pymongo语句的区别:

作用 MongoDB pymongo
写入一行 insertOne({}) insert_one({})
写入多行 insertMany([{},{}],{}]) insert_many([{},{},{}])
查询单一结果 findOne({}) find_one({})
查询全部结果 find({}) find({})
聚合管道查询 aggregate({}) aggregate({})
删除一行 deleteOne({}) delete_one({})
删除多行 deleteMany({}) delete_many({})
修改一行数据 updateOne({},{$:{}}) update_one({},{$:{}})
修改多行数据 updateMany({},{$:{}}) update_many({},{$:{}})

pymongo中所有命令结构和Mongodb语句几乎是一样的。
区别1. 显而易见的不同是MongoDB命令的大写字母改成了下划线加小写。
区别2. pymongo中key、运算符、修改器、逻辑判断符都必须加引号。(即:类型必须是str)
区别3. 在MongoDB语句中删除一个表的数据需要写db.testcoll.deleteMany({}) 而在Python中由于事先创建了collection对象,所以在执行命令时只需要写 collection对象名.delete_many({})

阅读正文前, 先安装,导入pymongo库
pip install pymongo
import pymongo

一、Python -> Pymongo -> MongoDB

✅1. 连接MongoDB,pymongo.MongoClien()

import pymongo
# 写法1,连接本机MongoDB
client = pymongo.MongoClient(host='localhost', port=27017)  # 写法2,效果相同
client = pymongo.MongoClient("mongodb://localhost:27017/")

附:client.list_database_names() 返回一个列表,包含当前所有数据库名字。

✅2. 连接数据库(database)& 集合(collection)

# 写法1。选择一个数据库,再连其中的集合
db = client.数据库名  # 需要手动提前创建好数据库
coll = db.集合名  # 集合不需要提前创建#  写法2。 此写法是避免和Python关键词冲突,  效果相同。
db = client['数据库名']
coll = db['集合名']

附:db.list_collection_names() 返回一个数据库中集合的名字。

✅3. 检查数据库、集合是否存在

# 先做判断、再用一行代码直接连接集合,去掉中间环节。
if "数据库名" in client.list_database_names() and "集合名" in client.list_database_names():coll =client['数据库名']['集合名']

附: 返回一个列表,包含所有集合的名字。coll.find() 返回集合中的所有文档。

增:

✅4.0 写入一行数据,insert_one({})

coll =client['数据库名']['集合名']
# insert_one() 方法插入数据
result= coll.insert_one({'name':'张三','age':20,'like':['看电视','玩手机','读书'],})
# 返回:result = <pymongo.results.InsertOneResult object at 0x000001A67ABFB010>
# 是不可迭代对象,无法用for遍历

附:print(result.inserted_id)方法可以得到上次写入数据的_id

✅4.1 写入多行数据,insert_many([])

many = [{"name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{"name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{"name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{"name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{"name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{"name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
]
result = coll.insert_many(many)
# 打印被插入文档的  _id 值列表:

附:print(result.inserted_ids)方法返回InsertManyResult对象,包含_id的列表

返回的数据结构:
[ObjectId(‘63241ee9bd28e97660c51bba’),ObjectId(‘63241ee9bd28e97660c51bbb’)…]

✅4.2 写入时自定义 _id

请记住_id的值必须是唯一的。不建议自定义_id

coll.insert_one({'_id':1,"name": "张三", "en": "zhangsan"})

删:

✅5.0 删除,delete_one({}),delete_many({}),

# 删除文档中的第一行数据。 {} 必须写,格式就这样。
coll.delete_one({})
# 删除全部
coll.delete_many({})

✅5.1 多条件判断删除

# 加条件删除,{}内写条件。 删除一行 age = 10 的文档
coll.delete_one({'age': 10})
# 删除所有 age = 10 的文档
coll.delete_many({'age': 10})# 删除所有age=20,name=郭娃子的所有数据
coll.delete_many({'age': 20, 'name': "郭娃子"})# 删除所有age > 11 或者 _id < 2
coll.delete_many({'$or': [{'age': {'$lt': 11}, '_id': {'$gt': 2}}]})# 用正则表达式删除en列中开头字母是z的所有行
coll.delete_many({'en': {'$regex': '^z'}})

注:更多运算符,在文章末尾有表格详细描述

✅5.2 去重(删除重复,保留一项)

在mongodb中去重是一件比较麻烦的事情,没有一个可以直接去重的方法。所以最好在写入数据的时候,用update在条件中加入判断保证唯一再写入。

# distinct可以得到指定列中的唯一值,即从重复内容中提取不重复的内容
# 返回list,在通过遍历每一个值去判断数量,再删掉多余的
# 如下示例代码,取 name列中的唯一值,遍历每一个值,判断数量,再删掉数量大于2的数据,保留一行# 获取name列所有的唯一值,返回list,并遍历
for i in coll.distinct('name'): # 统计i出现的次数count = coll.count_documents({'name': i})# 判断如果i 出现的次数大于1,那么if count > 1: # 那么就循环 count-1次for i in range(count-1): # 执行删除 i的操作coll.delete_one({'name': i})

查:

✅6.0 查询,返回一行。find_one()

# 返回的第一个匹配项。字典类型。包含_id开头的所有数据
result = coll.find_one()
print(result)

✅6.1 查询,返回多行。find()

# 返回的集合中的全部数据。可迭代对象。需要用for遍历。
for i in coll.find():print(i)

✅6.2 条件筛选返回的字段

以find()为示例,find_one()的格式是相同的。在上一篇文章中我有详细介绍过MongoDB语句的格式。在用Python时,同样遵循这个格式。

# 第一个{} 写条件。为空也要写一个空的{}
# 第二个{} 写需要显示的列名,"_id": 0 表示不返回_id的值,默认为1。"name": 1, "age": 1代表返回name和age列的数据
for i in coll.find({},{ "_id": 0, "name": 1, "age": 1 }):print(i)# 先写一组演示数据
coll.insert_many([{"name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{"name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{"name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{"name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{"name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{"name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
])
# 只like列,like列的value在MongoDB中的数据类型为:Array
# 在Python中like列的value的类型为:list
# 当我们需要like中的某一个索引的数据时,需要用Python方法取索引。
for i in coll.find({}, {"_id": 0, "like": 1}):print(i)print(i['like'][0]) # 或者使用聚合管道查询中的 $unwind 方法,可以把数组拆分出来。
for i in coll.aggregate([{'$unwind': {'path': "$like"}}]):print(i)

✅6.3 查询子集的方法

# 先写一组演示数据,我们需要查询张狗子like的b的value
many = [{'_id': 1, "name": "张狗子", 'like': {'a': '打游戏', 'b': '玩手机', 'c': '看书'}},{'_id': 2, "name": "李拐八", 'like': {'a': '看电视', 'b': '玩手机', 'c': '跑步'}},{'_id': 3, "name": "王九蛋", 'like': {'a': '羊了个羊', 'b': '玩手机', 'c': '放风筝'}},
]# 用  .   来链接
print(coll.find_one({'name': '张狗子'}, {'_id': 0, 'like.b': 1}))
print(coll.find_one({'name': '张狗子'}, {'_id': 0, 'like.b': 1})['like']['b'])

✅6.4 增加条件筛选返回的字段

# 先写一组演示数据,注:如果您当前文档中已有相同_id的数据时,写入如下示例数据时会报错。
coll.insert_many([{'_id': 1, "name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{'_id': 2, "name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{'_id': 3, "name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{'_id': 4, "name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{'_id': 5, "name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{'_id': 6, "name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
])
# 查询 2 < _id < 5 的文档数据,但是排除like列
for i in coll.find({'_id': {'$gt': 2, '$lt': 5}}, {"like": 0}):print(i)print('-' * 50)  # 打印分割线# 返回_id中包含3 或者 4 的文档数据,但是排除like列
for i in coll.find({'_id': {'$in': [3, 4]}}, {"like": 0}):print(i)
# 第一个{}, 空代表无筛选条件
# 第二个{},返回不包含like列的其他内容
# limit=5 ,表示最多返回5行数据
# sort=[("age", 1)],表示按age列数据升序排序 -1 代表降序
for i in coll.find({}, {"like": 0}, limit=5, sort=[("age", 1)]):print(i)# 第二种写法,效果是相同的。
for i in coll.find(projection={"like": 0}).limit(5).sort("age", 1):print(i)# 第三种写法, 按age升序查询最近3条文档数据.  推荐写法.
# sort("age",-1) 为降序, 默认不写就是升序.
for i in coll.find({}, {"like": 0}).limit(5).sort("age"):print(i)# skip(2)忽略前2行数据从第三行开始查询,limit(2)返回最多2行数据
for i in coll.find({}).skip(2).limit(2):print(i)

✅6.5 统计行数

# 不带条件的统计总行数方法
print(coll.estimated_document_count())# 带条件的统计行数方法
print(coll.count_documents({'name': {'$ne': ''}}))

✅6.6 查重 coll.distinct()

# 先写一组演示数据
coll.insert_many([{"name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{"name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{"name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{"name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{"name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{"name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},
])
# 按 name 列返回不重复的value。类型list
print(coll.distinct('name'))# 多条件用 and 、 or 连接
print(coll.distinct('name' and 'en'))# distinct方法只能查重,无法删除重复
# distinct返回的是一个list,所以通过for循环即可去重
for i in coll.distinct('name'):print(coll.delete_one({'name': i}))# 通过gruop函数对 age 相同的分组,再对组内有重复name的数据进行删除
for i in coll.aggregate([{'$group': {'_id': "$age", }}]).distinct('name'):print(coll.delete_one({'好友ID': i}))

改 :

✅7.0 修改字段,update_one({},{$:{}}),update_many({},{$:{}})

update_one({},{$:{}}) 修改一行数据
update_many({},{$:{}}) 同时修改多行数据
第一个{} 写条件, 第二个{$:{}} 写修改器+修改的内容。

修改器 作用
$set 修改列值
$inc 递增
$rename 重命名列
$unset 删除列
# 先写一组演示数据,注:如果您当前文档中已有相同_id的数据时,写入如下示例数据时会报错。
coll.insert_many([{'_id': 1, "name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{'_id': 2, "name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{'_id': 3, "name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{'_id': 4, "name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{'_id': 5, "name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{'_id': 6, "name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
])# 将age < 20 的所有数据,再原数据的基础上 +5
coll.update_many({'age': {'$lt': 20}}, {'$inc': {'age': 5}})# 将age > 18 的所有数据,再原数据的基础上增加一列note,并写入value'长大了'
coll.update_many({'age': {'$gt': 18}}, {'$set': {'note': '长大了'}})

✅7.1 修改like列中的字段

  1. 先用查询方法得到like列的数据
  2. 再通过Python自带方法处理list , 将 ‘玩手机’ 改成 ‘好好学习’
  3. 再将修改后的结果用update方法重新修改到like列中
# 先写一组演示数据,注:如果您当前文档中已有相同_id的数据时,写入如下示例数据时会报错。
coll.insert_many([{'_id': 1, "name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{'_id': 2, "name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{'_id': 3, "name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{'_id': 4, "name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{'_id': 5, "name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{'_id': 6, "name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
])# 主要是处理数据的过程套的有点多.
# i 返回的是一个 dict 包含了 "_id" 和 "like" 2个key
# 所以 i['like'] 才是我们需要修改的value for i in coll.find({}, {'like'}):if '玩手机' in i['like']:i['like'][i['like'].index('玩手机')] = '好好学习'coll.update_one({'_id': i['_id']}, {'$set': {'like': i["like"]}})

✅7.2 判断唯一再写入

在上面我们提到了,使用MongoDB删除重复数据是一件麻烦的事情。所以在写入前做判断是非常有必要的。

# 用 update_one 代替 intsert_one ,在写入数据时做判断后,再写入。
# upsert=True 数据库中没有时,就执行插入
coll.update_one({'name':'xxx',{'$setOnInsert':{'name':'xxx'}}},upsert=True})

✅8.0 集合管道查询 aggregate([{}])

管道命令操作符

命令 作用
$match 匹配特定条件的文档
$project 提取需要的字段
$group 按有相同值的列分组
$unwind 对数组类型拆分并逐一返回
$srot 排序,1正序,-1倒序
$limit 限制最大返回行
$skip 需要忽略前几行

每个管道操作符都会接受一连串文档,前一个操作符转换后的文档传递给下一个操作符,最后一个操作符的结果集返回给客户端;另外,不同的管道操作符可以按照任何顺序组合在一起使用,而且可以重复使用多次;下面介绍下各个管道操作符。

1. $match 筛选操作符

$match 可以使用常规的查询操作符,例如$gt$in等,但是不能使用地理空间操作符
$match 应该放在管道的最前位置,一是可以快速将不需要的文档过滤掉;二是可以使用集合已有的索引;

# 先写一组演示数据,注:如果您当前文档中已有相同_id的数据时,写入如下示例数据时会报错。
coll.insert_many([{'_id': 1, "name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{'_id': 2, "name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{'_id': 3, "name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{'_id': 4, "name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{'_id': 5, "name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{'_id': 6, "name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
])# 1. 条件过滤。 查询满足age < 16 的数据
for i in coll.aggregate([{'$match': {"age": {'$lt': 16}}}]):print(i)# 2. 双管道过滤。 第一个管道返回满足age < 16的子文档
# 2.1 在第一个管道的子文档中再筛选名字中包含张 或 李 的文档
for i in coll.aggregate([{'$match': {"age": {'$lt': 16}}}, {'$match': {'name': {'$regex': '[张李]'}}}]):print(i)

2. $project 筛选操作符

$project可以从子文档提取字段、可以重命名字段、可以对字段使用表达式操作等;

#  第一个管道依旧是返回满足age < 16的子文档 ,
#  在第一个管道的子文档中设置只返回name列的文档
for i in coll.aggregate([{'$match': {"age": {'$lt': 16}}}, {'$project': {'name': 1, '_id': 0}}]):print(i)#  返回显示name列,并额外新增一列note,不改变原有数据
for i in coll.aggregate([{'$project': {'note': '备注', 'name': 1}}]):print(i)# 先来一组示例数据
coll.insert_many([{'name': '张狗子', 'en': 'zgd', 'score': 10, 'score2': 10},{'name': '李拐八', 'en': 'lgb', 'score': 11, 'score2': 10},{'name': '王九蛋', 'en': 'wjd', 'score': 9, 'score2': 10},{'name': '赵飞机', 'en': 'zfj', 'score': 12, 'score2': 10},{'name': '周白鸡', 'en': 'zbj', 'score': 15, 'score2': 10},{'name': '郭爸爸', 'en': 'gwz', 'score': 20, 'score2': 10},
])
# 将文档原数据中的score 和 score2 相加,返回新的一列 totalscore (不改变原文档)
for i in coll.aggregate([{'$project': {'totalPay': {'$add': ['$score', '$score2']}}}]):print(i)# 字符串数据中相加,返回新的一列 nameplus(不改变原文档)
for i in coll.aggregate([{'$project': {'nameplus': {'$concat': ['$name', '$en']}}}]):print(i)

3. $group 分组操作符

$group对有相同数据的字段进行分组

# 一组示例数据
coll.insert_many([{'gender': '男', 'name': '张狗子', 'en': 'zgd', 'score': 10},{'gender': '男', 'name': '李拐八', 'en': 'lgb', 'score': 11},{'gender': '女', 'name': '王九蛋', 'en': 'wjd', 'score': 9},{'gender': '男', 'name': '赵飞机', 'en': 'zfj', 'score': 12},{'gender': '女', 'name': '周白鸡', 'en': 'zbj', 'score': 15},{'gender': '男', 'name': '郭爸爸', 'en': 'gwz', 'score': 20},
])
# 分组,将文档数据按gender分成男女两组,并计算他们的平均score,显示为新列scoreavg
for i in coll.aggregate([{'$group': {'_id': "$gender", 'scoreavg': {'$avg': '$score'}}}]):print(i)# 分组,将文档数据按gender分成男女两组,并将她们的name插入到新列namelist中返回
for i in coll.aggregate([{'$group': {'_id': "$gender", 'namelist': {'$push': '$name'}}}]):print(i)# 分组,将文档数据按gender分成男女两组,并按返回对应gender的name数量。
for i in coll.aggregate([{'$group': {'_id': '$gender', 'name': {'$push': '$$ROOT'}}}]):print(i)# 当我们想要知道总行数时,就可以将所有的数据分成一组然后统计某一列的总数。
for i in coll.aggregate([{'$group': {'_id': 'null', 'name': {'$sum': 1}}}]):print(i)

$$ROOT方法可以将查询的文档结果放入一个数组中,包含对应行的全部信息。
注意 ROOT必须大写否则会报错。

# 当你需要每个分组中成员的完整数据时。
for i in coll.aggregate([{'$group': {'_id': '$gender', 'name': {'$push': '$$ROOT'}}}]):print(i)

4. $sort 排序
$limit 限制最大行
$skip 忽略行

# 一组示例代码
coll.insert_many([{'gender': '男', 'name': '张狗子', 'en': 'zgd', 'score': 10},{'gender': '男', 'name': '李拐八', 'en': 'lgb', 'score': 11},{'gender': '女', 'name': '王九蛋', 'en': 'wjd', 'score': 9},{'gender': '男', 'name': '赵飞机', 'en': 'zfj', 'score': 12},{'gender': '女', 'name': '周白鸡', 'en': 'zbj', 'score': 15},{'gender': '男', 'name': '郭爸爸', 'en': 'gwz', 'score': 20},
])
# 按 score 降序返回结果。 不写或者写 1 为升序
for i in coll.aggregate([{'$sort': {'score': -1}}]):print(i)# 分组统计男女的成员数量存入counter列,并按counter升序排序
for i in coll.aggregate([{'$group': {'_id': "$gender", 'counter': {'$sum': 1}}}, {'$sort': {'counter': 1}}]):print(i)# 查询score不等于0的所有数据,并且忽略前2条,并最大返回2条。
# 注意,按从左到右的顺序执行每一个管道命令的,如果你写{'$limit': 2},{'$skip': 2}那么永远不会有结果,因为你限制了最大输出2条,然后再限制了忽略前2条,所以不会有结果。
for i in coll.aggregate([{'$match': {'score': {'$ne': 0}}}, {'$skip': 2},{'$limit': 2}]):print(i)

5. $unwindt 拆分数组

# 先写一组演示数据
coll.insert_many([{"name": "张狗子", "en": "zgd", "age": 10, 'like': ['打游戏', '玩手机', '看书']},{"name": "李拐八", "en": "lgb", "age": 11, 'like': ['看电视', '玩手机', '画画']},{"name": "王九蛋", "en": "wjd", "age": 9, 'like': ['刷抖音', '玩手机', '唱歌']},{"name": "赵飞机", "en": "zfj", "age": 12, 'like': ['打游戏', '玩手机', '跳舞']},{"name": "周白鸡", "en": "zbj", "age": 15, 'like': ['逛街', '玩手机', '睡觉']},{"name": "郭娃子", "en": "gwz", "age": 20, 'like': ['看电视', '玩手机', '弹琴']}
])# $unwind 方法,可以把文档数据是数组的内容逐一拆分返回。
for i in coll.aggregate([{'$unwind': {'path': "$like"}}]):print(i)

6. 使用聚合方法去重


条件运算符

逻辑判断符 格式 注释
$or $or:[ { key: value} , { key: value } ] 满足多个条件中的一个
$and $and:[ { key: value } , { key: value } ] 同时满足多个条件,不过{key:value,key:value}的格式也是and逻辑
$not $not { key: value } 反向匹配,否定逻辑
$nor $nor{ key: value } nor = not or,反向匹配多个条件中的某一个
运算符 格式 作用
{ key: value } (冒号)等于
$lt key:{ $lt: value } 小于
$lte key:{ $lte: value } 小于等于
$gt key:{ $gt: value } 大于
$gte key:{ $gte: value } 大于等于
$ne key:{ $ne: value } 不等于
$in key:{ $in: [1,10]} 包含
$nin key:{ $nin: [1,10]} 不包含
$exists key:{ $exists: bool} 是否存在,bool,{$exists:true}
$regex key: {$regex:‘.*?’} 匹配正则表达式
$type key: {$type:int} 判断数据类型
$add $add: [$key1, $key2] 加,将key1 + key2
$subtract $subtract: [$key1, $key2] 减,返回key1 - key2
$multiply $multiply: [$key1, $key2] 乘,返回key1 × key2
$divide $divide: [$key1, $key2] 除,返回key1 ÷ key2
$avg {$avg: $key} 平均值,返回key列的平均值
$mod key: {$mod:[2,0]} 取余,返回key列value ÷ 2 = 0 的文档
$min $min: $key 最小值,返回key列中的最小值
$max $max: $key 最大值,返回key列中的最大值
$push key1:{$push: key2} 插入,将key2的值插入到key1中返回list

日期表达式$year$month$hour等等,需要注意的是只能对日期类型的字段进行日期操作;
字符串表达式$substr截取字符串、$concat连接、$toLower转小写

Mongdb篇三。 用Python代码实现Mongdb数据库的增删查改、集合管道示例,超详细,全部用实例print大法演示功能通俗易懂。学pymongo库看一篇就够相关推荐

  1. 数据库的增删查改(全部重点知识一篇整合,包括数据库查询的进阶内容)

    目录 一.新增数据 (1)单行数据全列输入 (2)指定列插入 (3)多行插入 二.简单查询数据 (1)全列查询 (2)指定列查询 (3)查询的字段是表达式 (4)去重操作distinct (5)排序操 ...

  2. Python实现SQL Server 2008的增删查改+连接过程中出现的问题以及解决方法

    Python操作SQL Server 2008需要一个名为pymssql的库,如果没有这个库可以通过在cmd中输入如下命令来安装: pip install pymssql 闲话少说,直接贴代码: # ...

  3. python中关于list列表的增删查改操作

    python中list的操#python创建列表的时候,会以堆栈的形式存放数据,从右向左往堆栈中存放数据 movies=["The holy Grail","The li ...

  4. python学习笔记05 字典dic增删查改常用操作及嵌套

    字典dic hashable数据(不可变)才能作为key  list不可 ,不是按照我们保存的顺序保存的,可以认为是无序的. 新增 dic["国际章"] = "汪峰的老婆 ...

  5. 只需一行代码实现增删查改,微软已经让我们很简单。谈AccessDataSource的使用。...

    这是一个很简单的内容.日常我们总腻烦做增删查改这样的重复性的劳动,如果你的项目不是太大,如果你的团队很小,或许就是你一个人,那么就完全可以参考以下这样简单的方式.微软已经给我们做了.我们只要写一行代码 ...

  6. python实现MySQL的增删查改

    表结构: 利用python操作数据库需要导入pymysql数据库,如果没有这个库可以利用cmd进行安装,打开cmd然后输入: pip install pymysql 即可成功安装. python实现数 ...

  7. ML:文本、图像等数值化数据相似度计算之余弦相似度计算三种python代码实现

    ML:文本.图像等数值化数据相似度计算之余弦相似度计算三种python代码实现 目录 相似度计算之余弦相似度计算 输出结果 三种python代码实现

  8. Python学生信息管理系统(增删查改、模糊查找、txt文件输出)# 谭子

    一.系统需求说明 本项目计划实现一个学生管理系统,学生信息包括:姓名.性别.手机号码,系统包含以下功能. 模块 子模块 说明 查询模块 查询全部学生的信息 显示当前系统内所有学员的信息 查询模块 精准 ...

  9. Python实现飞机大战-第二部分(附源码、素材、超详细教程)

    飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...

最新文章

  1. linux正则表达式sed
  2. Python selenium巧用Javascript脚本注入解决按钮点选问题
  3. wifi拥挤时防掉线小技巧
  4. shell脚本视频学习1
  5. 【语义分割】Pyramid Scene Parsing Network(PSNET)
  6. this绑定丢失的问题
  7. postman本地测试post接口
  8. 揭露北京车牌租赁公司的内幕
  9. app运营推广投放策略
  10. r语言如何计算t分布临界值_R语言系列第四期:R语言单样本双样本差异性检验...
  11. 自动化测试框架的Step By Step搭建及测试实战(1)
  12. Linux(四):什么是Bash、什么是shell?
  13. 电子产品加拿大IC认证(ISED)指南
  14. matlab软件及基础实验第8单元,《MATLAB统计分析与应用:40个案例分析》程序与数据(内含彩蛋)...
  15. Spark从本地文件中统计包含某个字母的行数
  16. 公共基础知识题库 计算机考点,公共基础知识考点
  17. 八、新人成才之路《成才大原则 你不成才是学习方法错了》
  18. 《手机拍照与视频》那点事
  19. OIM实现OIM用户修改、OIM用户Disable流程审批
  20. Nginx配置http301强制跳转https

热门文章

  1. 交易猫闲鱼转转链接搭建/带完整版源码
  2. Redis学习笔记(一)—— 在windows下搭建redis服务器
  3. 基于fpga的sobel边缘检测
  4. tk组件学习---text
  5. 传感器-光感和指南针
  6. 63、基于51单片机数字频率计NE555数码管显示系统设计(程序+原理图+Proteus仿真+参考论文+开题报告+任务书+元器件清单等)
  7. Cassandra:集群环境搭建和测试
  8. word2vec 笔记
  9. [导入]一篇软文的思考。
  10. 房产估值模型训练及预测结果2