<jupyter_start><jupyter_text>AND、OR和子文档和数组![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-16-52-34.png)  显式AND查询和OR查询 隐式AND查询与显式AND查询在学习MongoDB基本语法的时候，我们假如我们要查下：> 年龄大于20并且薪资大于9999的所有人那么MongoDB的查询语句写为：```pythonhandler.find({'age': {'$gt': 20}, 'salary': {'$gt': 9999}})```此时，这里的`age`和`salary`两个条件需要同时满足，在逻辑上他们是“与”的关系。但是我并没有把`AND`这个关键字写出来，所以这叫做“隐式AND查询”。而所谓的“显式AND查询”，它的效果和上面的隐式查询是一样的，但是需要把“AND”关键字写出来，写为：```pythonhandler.find({    '$and': [        {'age': {'$gt': 20}},        {'salary': {'$gt': 9999}}       ]   })```所以显示AND查询的基本语法为：```python 这里的查询条件1、查询条件2、查询条件3均为字典handler.find({'$and': [查询条件1, 查询条件2, 查询条件3]})``` OR 查询OR查询只有显式的写法，表示多个条件只要其中一个满足即可。例如要查询：> 年龄大于20或者薪资大于9999那么查询语句可以写为：```pythonhandler.find({'$or': [{'age': {'$gt': 20}}, {'salary': {'$gt': 9999}}]})```OR查询的基本语法为：```python 这里的查询条件1、查询条件2、查询条件3均为字典handler.find({'$or': [查询条件1, 查询条件2, 查询条件3]})```  如何生成练习数据？扫码关注微信公众号![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/qrcode.jpg)回复：> 数据库获取本书源代码，使用Python运行`chapter_7`文件夹中的`import_example_data_1.py`文件，即可在本地MongoDB中生成对应的练习数据example_data_1.<jupyter_code># 初始化数据库连接

import pymongo

handler = pymongo.MongoClient().chapter_7.example_data_1
# 隐式AND查询所有age大于25并且salary小于8000并且sex为男的数据

rows = handler.find({'age': {'$gt': 25}, 'salary': {'$lt': 8000}, 'sex': '男'}, {'_id': 0})
for row in rows:
    print(row)
# 显式AND查询所有age大于25并且salary小于8000并且sex为男的数据


rows = handler.find({
    '$and': [
        {'age': {'$gt': 25}},
        {'salary': {'$lt': 8000}},
        {'sex': '男'}]
    },
    {'_id': 0})
for row in rows:
    print(row)
# 显式AND查询与隐式AND查询混用

rows = handler.find({
    '$and': [
        {'age': {'$gt': 25}, 'salary': {'$lt': 8000}},
        {'sex': '男'}]
    },
    {'_id': 0})
for row in rows:
    print(row)
# OR查询，查询所有年龄大于25或者薪资小于9000的人

rows = handler.find({
    '$or': [
        {'age': {'$gt': 25}},
        {'salary': {'$lt': 9000}}
        ]
    },
    {'_id': 0})
for row in rows:
    print(row)
# OR查询，查询所有年龄大于1000岁或者薪资小于2000的人，第一个条件找不到也没有关系

rows = handler.find({
    '$or': [
        {'age': {'$gt': 1000}},
        {'salary': {'$lt': 2000}}
        ]
    }, 
    {'_id': 0})
for row in rows:
    print(row)
# OR查询，查询所有年龄大于1000岁或者薪资小于0的人，所有条件都找不到才会返回空

rows = handler.find({
    '$or': [
        {'age': {'$gt': 1000}},
        {'salary': {'$lt': 0}}
        ]
    }, 
    {'_id': 0})
for row in rows:
    print(row)<jupyter_output><empty_output><jupyter_text>不能写成隐式AND查询的情况<jupyter_code># 首先我们搜索一下，年龄大于28岁，薪资大于9900的所有人

rows = handler.find({
    '$or': [
        {'age': {'$gt': 28}},
        {'salary': {'$gt': 9900}}
        ]
    }, 
    {'_id': 0})
for row in rows:
    print(row)
# 现在，要从这一批人里面找到所有id小于20或者性别为男的人

rows = handler.find(
    {'$and': [
        {'$or': [
            {'age': {'$gt': 28}},
            {'salary': {'$gt': 9900}}
            ]
        },
        {'$or': [
            {'id': {'$lt': 20}},
            {'sex': '男'}
            ]
        }
        ]
    },
    {'_id': 0})
for row in rows:
    print(row)<jupyter_output>{'id': 1, 'age': 29, 'salary': 2664, 'sex': '女'}
{'id': 14, 'age': 29, 'salary': 8825, 'sex': '女'}
{'id': 15, 'age': 29, 'salary': 7635, 'sex': '女'}
{'id': 23, 'age': 29, 'salary': 5977, 'sex': '男'}
{'id': 39, 'age': 29, 'salary': 6671, 'sex': '男'}
{'id': 52, 'age': 29, 'salary': 9868, 'sex': '男'}
{'id': 56, 'age': 30, 'salary': 2385, 'sex': '男'}
{'id': 58, 'age': 25, 'salary': 9975, 'sex': '男'}<jupyter_text>![读者交流QQ群](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-16-09-59-56.png)![微信公众号](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/wechatplatform.jpg)![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-20-47-47.png)  MongoDB的聚合查询（一）——筛选、操作值![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-16-52-34.png)  MongoDB的聚合操作作为一个数据库，MongoDB除了基本的增删改查外，还能进行一些统计运算和数据处理。聚合查询(aggregation)就是MongoDB进行数据处理的工具之一。聚合查询是把多个不同的阶段（stage）组合在一起，从而处理数据。 基本语法```pythoncollection.aggregate([阶段1, 阶段2, 阶段3, ..., 阶段n])```每一个阶段都是一个字典。一个聚合查询可以有0个、1个或者多个阶段。数据先进入第一个阶段，第一个阶段处理以后的数据进入第二个阶段，第二个阶段处理以后的数据进入第三个阶段……。 查询阶段```python{'$match': {find第一个参数}}``` 修改字段```python{'$project': {'字段名1': 0, '字段名2': 1, ...}}```  查询阶段<jupyter_code># 初始化环境

import pymongo
handler = pymongo.MongoClient().chapter_7.example_data_1
# 没有阶段的聚合查询

rows = handler.aggregate([])
for row in rows:
    print(row)
# 使用find查询数据

rows = handler.find()
for row in rows:
    print(row)
# 查询所有性别为男的数据

rows = handler.aggregate([{'$match': {'sex': '男'}}])
for row in rows:
    print(row)
# 查询所有性别为女并且age小于25的数据

rows = handler.aggregate([{'$match': {'sex': '女', 'age': {'$lt': 25}}}])
for row in rows:
    print(row)
# 查询所有（性别为女并且age小于25）或者（性别为男，age小于20）的数据
rows = handler.aggregate([
    {'$match': {
        '$or': [
            {'sex': '女', 'age': {'$lt': 25}},
            {'sex': '男', 'age': {'$lt': 20}}
        ]
    }}
])
for row in rows:
    print(row)<jupyter_output>{'_id': ObjectId('5b0ab1a46b78a66b9a676cb9'), 'id': 2, 'age': 19, 'salary': 3086, 'sex': '男'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cba'), 'id': 3, 'age': 15, 'salary': 7662, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cbb'), 'id': 4, 'age': 23, 'salary': 7001, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cbc'), 'id': 5, 'age': 24, 'salary': 8042, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cbe'), 'id': 7, 'age': 16, 'salary': 8916, 'sex': '男'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cbf'), 'id': 8, 'age': 24, 'salary': 5191, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cc1'), 'id': 10, 'age': 19, 'salary': 9775, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cc3'), 'id': 12, 'age': 17, 'salary': 9582, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cc7'), 'id': 16, 'age': 18, 'salary': 4204, 'sex': '女'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676cc9'), 'id': 18, 'age': 17, 'salary': 4600, 'sex': '男'}
{'_id': ObjectId('5b0ab1a46b78a66b9a676ccd'), 'id': 22, [...]<jupyter_text>修改或者限定返回字段<jupyter_code># 查询所有7000 < salary < 8000的数据

rows = handler.aggregate([{'$match': {'salary': {'$lt': 8000, '$gt': 7000}}}])
for row in rows:
    print(row)
# 不返回_id

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'_id': 0}}
])
for row in rows:
    print(row)
# 只返回id和sex，不显式删除_id

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'id': 1, 'sex': 1}}
])
for row in rows:
    print(row)
# 只返回id和sex，显式删除_id

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'_id': 0, 'id': 1, 'sex': 1}}
])
for row in rows:
    print(row)
# 除了_id外，其他的元素只能同时指定不显示，或者同时指定显示，不能0和1混用，否则必定报错

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'salary': 0, 'id': 1, 'sex': 1}}   # 这里必定报错
])
for row in rows:
    print(row)
# 增加新的字段

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'_id': 0, 'id': 1, 'sex': 1, 'hello': 'word'}}
])
for row in rows:
    print(row)
# 复制已有字段

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'_id': 0, 'id': 1, 'sex': 1, '月薪': '$salary'}}
])
for row in rows:
    print(row)
# 覆盖现有字段

rows = handler.aggregate([
    {'$match': {'salary': {'$lt': 8000, '$gt': 7000}}},
    {'$project': {'_id': 0, 'id': 1, 'sex': '保密'}}
])
for row in rows:
    print(row)
# 包含嵌套字段的数据
handler2 = pymongo.MongoClient().chapter_7.example_data_2
rows = handler2.find()
for row in rows:
    print(row)
# 普通方法读取嵌套字段中的name

rows = handler2.find()
for row in rows:
    print(row['user']['name'])
# 使用$project抽出嵌套字段

rows = handler2.aggregate([
    {'$project': {'content': 1, '_id': 0, 'name': '$user.name'}}
])

for row in rows:
    print(row)
# 以$开头的特殊值无法正常显示，值本身就是数字的也无法正常显示

rows = handler2.aggregate([
    {'$project': {'content': 1, '_id': 0, 'name': '$user.name', 'new': '$我是特殊值'}}
])

for row in rows:
    print(row)
# 使得以$开头的特殊值可以正常显示

rows = handler2.aggregate([
    {'$project': {'content': 1,
                  '_id': 0,
                  'name': '$user.name',
                  'new': {'$literal': '$我是特殊值'},
                  'num_1': {'$literal': 1},
                  'num_0': {'$literal': 0}
                 }
    }
])

for row in rows:
    print(row)<jupyter_output>{'content': '这道菜真好吃', 'name': '青南', 'new': '$我是特殊值', 'num_1': 1, 'num_0': 0}
{'content': '儿童节快乐', 'name': '小盆友', 'new': '$我是特殊值', 'num_1': 1, 'num_0': 0}
{'content': '我的礼物在哪里？', 'name': '学习鸡', 'new': '$我是特殊值', 'num_1': 1, 'num_0': 0}
{'content': '求勾搭', 'name': '单身的小X', 'new': '$我是特殊值', 'num_1': 1, 'num_0': 0}<jupyter_text>![读者交流QQ群](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-16-09-59-56.png)![微信公众号](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/wechatplatform.jpg)![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-20-47-47.png)  MongoDB的聚合查询（二）——分组查询![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-16-52-34.png)  MongoDB的聚合操作作为一个数据库，MongoDB除了基本的增删改查外，还能进行一些统计运算和数据处理。聚合查询(aggregation)就是MongoDB进行数据处理的工具之一。聚合查询是把多个不同的阶段（stage）组合在一起，从而处理数据。 基本语法```pythoncollection.aggregate([阶段1, 阶段2, 阶段3, ..., 阶段n])```每一个阶段都是一个字典。一个聚合查询可以有0个、1个或者多个阶段。数据先进入第一个阶段，第一个阶段处理以后的数据进入第二个阶段，第二个阶段处理以后的数据进入第三个阶段……。 分组操作```python{'$group': {'_id': '$被去重的字段名'}}{'$group': {'_id': '$被去重的字段名', '最大值': {'$max': '$字段名'}, '最小值': {'$min': '$字段名'}}}{'$group': {'_id': '$被去重的字段名', '平均值': {'$avg': '$字段名'}, '求和': {'$sum': '$字段名'}}}{'$group': {'_id': '$被去重的字段名', '计数': {'$sum': 1}}}{'$group': {'_id': '$被去重的字段名', '最新值': {'$last': '$字段名'}, '最旧值': {'$last': '$字段名'}}}```<jupyter_code># 连接数据库

import pymongo
handler = pymongo.MongoClient().chapter_7.example_data_4<jupyter_output><empty_output><jupyter_text>替代 distinct<jupyter_code>handler.distinct('name')
rows = handler.aggregate([
    {'$group': {'_id': '$name'}}
])
print(rows)

list(rows)
# 如果name 字段不加美元符号会怎么样

rows = handler.aggregate([
    {'$group': {'_id': 'name'}}
])
list(rows)<jupyter_output><empty_output><jupyter_text>增加计算统计值<jupyter_code>rows = handler.aggregate([
    {'$group': {'_id': '$name',
                '平均分': {'$avg': '$score'},
                '最大分': {'$max': '$score'},
                '最小分': {'$min': '$score'},
                '总分': {'$sum': '$score'}}}
])
list(rows)
# 如果score 字段不加美元符号会怎么样？

rows = handler.aggregate([
    {'$group': {'_id': '$name',
                '平均分': {'$avg': 'score'},
                '最大分': {'$max': 'score'},
                '最小分': {'$min': 'score'},
                '总分': {'$sum': 'score'}}}
])
list(rows)<jupyter_output><empty_output><jupyter_text>计数<jupyter_code>rows = handler.aggregate([
    {'$group': {'_id': '$name',
                '计数': {'$sum': 1},
                }}
])
list(rows)<jupyter_output><empty_output><jupyter_text>去重并保留字段<jupyter_code>rows = handler.aggregate([
    {'$group': {'_id': '$name',
                'date': {'$last': '$date'},
                'score': {'$last': '$score'}
                }}
])
list(rows)
rows = handler.aggregate([
    {'$group': {'_id': '$name',
                'date': {'$first': '$date'},
                'score': {'$first': '$score'}
                }}
])
list(rows)<jupyter_output><empty_output><jupyter_text>![读者交流QQ群](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-16-09-59-56.png)![微信公众号](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/wechatplatform.jpg)![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-20-47-47.png)  MongoDB的聚合查询（三）——拆分数组![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-16-52-34.png)  MongoDB的聚合操作作为一个数据库，MongoDB除了基本的增删改查外，还能进行一些统计运算和数据处理。聚合查询(aggregation)就是MongoDB进行数据处理的工具之一。聚合查询是把多个不同的阶段（stage）组合在一起，从而处理数据。 基本语法```pythoncollection.aggregate([阶段1, 阶段2, 阶段3, ..., 阶段n])```每一个阶段都是一个字典。一个聚合查询可以有0个、1个或者多个阶段。数据先进入第一个阶段，第一个阶段处理以后的数据进入第二个阶段，第二个阶段处理以后的数据进入第三个阶段……。 拆分数组```python{'$unwind': '$字段名'}```<jupyter_code># 连接数据库

import pymongo
handler = pymongo.MongoClient().chapter_7.example_data_3
# 原始数据

rows = handler.find()
for row in rows:
    print(row)
rows = handler.aggregate([
    {'$unwind': '$size'}
])
for row in rows:
    print(row)
# 如果不加$符号，必定报错
rows = handler.aggregate([
    {'$unwind': 'size'}
])
for row in rows:
    print(row)
rows = handler.aggregate([
    {'$unwind': '$price'}
])
for row in rows:
    print(row)
# 全部拆开

rows = handler.aggregate([
    {'$unwind': '$size'},
    {'$unwind': '$price'}
])
for row in rows:
    print(row)<jupyter_output>{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'S', 'price': 100}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'S', 'price': 200}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'S', 'price': 300}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'S', 'price': 800}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'M', 'price': 100}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'M', 'price': 200}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'M', 'price': 300}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'M', 'price': 800}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'L', 'price': 100}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'L', 'price': 200}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'), 'name': '衬衣', 'size': 'L', 'price': 300}
{'_id': ObjectId('5b13b3dc6b78a645a846d19b'[...]<jupyter_text>![读者交流QQ群](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-02-16-09-59-56.png)![微信公众号](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/wechatplatform.jpg)![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-20-47-47.png)  MongoDB的聚合查询（四）——联集合查询![](https://kingname-1257411235.cos.ap-chengdu.myqcloud.com/2019-03-03-16-52-34.png)  MongoDB的聚合操作作为一个数据库，MongoDB除了基本的增删改查外，还能进行一些统计运算和数据处理。聚合查询(aggregation)就是MongoDB进行数据处理的工具之一。聚合查询是把多个不同的阶段（stage）组合在一起，从而处理数据。 基本语法```pythoncollection.aggregate([阶段1, 阶段2, 阶段3, ..., 阶段n])```每一个阶段都是一个字典。一个聚合查询可以有0个、1个或者多个阶段。数据先进入第一个阶段，第一个阶段处理以后的数据进入第二个阶段，第二个阶段处理以后的数据进入第三个阶段……。 联集合查询```python{'$lookup': {        'from': '被查询的集合名',        'localField': '主集合字段',        'foreignField': '被查集合的字段',        'as': '查询结果被保存的字段名'    }}```<jupyter_code># 连接数据库

import pymongo
db = pymongo.MongoClient().chapter_7
post = db.example_post
user = db.example_user
# 以example_user 为主集合，查询每个用户发送的所有微博
from pprint import pprint

weibo_per_user = user.aggregate([
    {'$lookup': {
        'from': 'example_post',
        'localField': 'id',
        'foreignField': 'user_id',
        'as': 'weibo'
    }}
])

for row in weibo_per_user:
    pprint(row, indent=2)
# 以example_post 为主集合，查询每个用户发送的所有微博
from pprint import pprint

user_per_weibo = post.aggregate([
    {'$lookup': {
        'from': 'example_user',
        'localField': 'user_id',
        'foreignField': 'id',
        'as': 'user'
    }}
])

for row in user_per_weibo:
    pprint(row, indent=2) 
# 以example_user 为主集合，查询每个用户发送的所有微博，并拆开结果
from pprint import pprint

weibo_per_user = user.aggregate([
    {'$lookup': {
        'from': 'example_post',
        'localField': 'id',
        'foreignField': 'user_id',
        'as': 'weibo'
    }},
    {'$unwind': '$weibo'}
])

for row in weibo_per_user:
    print(row)
# 以example_user 为主集合，查询每个用户发送的所有微博，并拆开结果，再提取字段出来
import json
from pprint import pprint

weibo_per_user = user.aggregate([
    {'$lookup': {
        'from': 'example_post',
        'localField': 'id',
        'foreignField': 'user_id',
        'as': 'weibo'
    }},
    {'$unwind': '$weibo'},
    {'$project': {
        'id': 1,
        'name': 1,
        'register_date': 1,
        'age': 1,
        'work': 1, 
        'weibo': '$weibo.content',
        'post_time': '$weibo.post_time'
    }}
])

for row in weibo_per_user:
    pprint(row, indent=2)
# 以example_user 为主集合，查询特定用户发送的所有微博，并拆开结果，再提取字段出来
import json
from pprint import pprint

weibo_per_user = user.aggregate([
    {'$match': {'name': '王小一'}},
    {'$lookup': {
        'from': 'example_post',
        'localField': 'id',
        'foreignField': 'user_id',
        'as': 'weibo'
    }},
    {'$unwind': '$weibo'},
    {'$project': {
        'id': 1,
        'name': 1,
        'register_date': 1,
        'age': 1,
        'work': 1, 
        'weibo': '$weibo.content',
        'post_time': '$weibo.post_time'
    }}
])

for row in weibo_per_user:
    pprint(row, indent=2)
# 以example_user 为主集合，查询所有用户发送的所有微博，并拆开结果，再提取字段出来，最后筛选特定用户
import json
from pprint import pprint

weibo_per_user = user.aggregate([
    {'$lookup': {
        'from': 'example_post',
        'localField': 'id',
        'foreignField': 'user_id',
        'as': 'weibo'
    }},
    {'$unwind': '$weibo'},
    {'$project': {
        'id': 1,
        'name': 1,
        'register_date': 1,
        'age': 1,
        'work': 1, 
        'weibo': '$weibo.content',
        'post_time': '$weibo.post_time'
    }},
    {'$match': {'name': '王小一'}}
])

for row in weibo_per_user:
    pprint(row, indent=2)<jupyter_output>{ '_id': ObjectId('5b1b81266b78a632394ab1ac'),
  'age': 17,
  'id': 1001,
  'name': '王小一',
  'post_time': '2018-06-12 08:23:12',
  'register_date': '2018-06-09',
  'weibo': '好不容易放假，楼上装修太吵了',
  'work': '学生'}
{ '_id': ObjectId('5b1b81266b78a632394ab1ac'),
  'age': 17,
  'id': 1001,
  'name': '王小一',
  'post_time': '2018-06-15 23:23:12',
  'register_date': '2018-06-09',
  'weibo': '青山不改绿水长流，同学们后会有期',
  'work': '学生'}
{'fraction_non_alphanumeric': 0.23207234018199507, 'fraction_numerical': 0.07354203628455332, 'mean_word_length': 4.13337250293772, 'pattern_counts': {'":': 0, '<': 42, '<?xml version=': 0, '>': 43, 'https://': 18, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '397003', 'license': 'MIT', 'n_tokens_mistral': 9475, 'n_tokens_neox': 9057, 'n_words': 1245, 'path': '视频课件/MongoDB的高级语法.ipynb', 'repo_name': 'kingname/SourceCodeofMongoRedis', 'size': '17473'}