原文链接: MongoDB 对象数组中批量添加字段
上一篇: vue router 路由守卫 登录验证
下一篇: Python 多线程 定时任务
问题描述:
在属性数组中含有多个对象, 需要为这些对象添加一个和自己数据有关的属性]
使用concat失败, 不支持数组, 使用 unwind先进行展开, 后进行添加操作, 然后再使用group和push创建新的数组属性
完整,代码, 可以看到friends数组中的每个对象都有了新字段, 并且数据时有该对象相关的
from pymongo import MongoClient
import pandas as pd
# 数据库连接配置
HOST = "localhost"
PORT = 27017
# 数据库版本以下划线分割, 需要创建对应的文件夹
DB_NAME = "stus"
client = MongoClient(HOST, PORT)
db = client[DB_NAME]
import json
def init():
db['stus'].delete_many({})
db['stus'].insert_many([
{
"name": 'a1',
"friends": [
{
"name": 'b1',
"cls_no": 'c1'
},
{
"name": 'b2',
"cls_no": 'c2'
},
]
},
{
"name": 'a2',
"friends": [
{
"name": 'bb1',
"cls_no": 'cc1'
},
{
"name": 'bb2',
"cls_no": 'cc2'
},
]
},
{
"name": 'a3',
"friends": [
{
"name": 'bbb1',
"cls_no": 'ccc1'
},
{
"name": 'bbb2',
"cls_no": 'ccc2'
},
]
},
])
init()
res = db['stus'].aggregate(
[
# {
# '$addFields': {
# 'friends_new': {'$concat': ["$friends.name", "-"]},
# }
# },
{
"$unwind": "$friends"
},
{
'$addFields': {
'friends.friends_new': {'$concat': ["$friends.name", "--", "$friends.cls_no"]},
}
},
{
"$group": {
"_id": "$name",
"friends":{
"$push":"$friends"
}
}
},
{
'$project':
{
"_id": 0,
"friends":1,
"name": "$_id",
}
},
]
)
data = list(res)
for i in data:
print(i)
# {'name': 'a', 'stu_cls_no': 'c1', 'cls_doc': [{'cls_no': 'c1', 'cls_name': 'c1_class'}], 'new_name': 'a-c1'}
# {'name': 'b', 'stu_cls_no': 'c2', 'cls_doc': [{'cls_no': 'c2', 'cls_name': 'c2_class'}], 'new_name': 'b-c2'}
# {'name': 'c', 'stu_cls_no': 'c1', 'cls_doc': [{'cls_no': 'c1', 'cls_name': 'c1_class'}], 'new_name': 'c-c1'}
df = pd.read_json(json.dumps(data), )
df.to_excel('t.xlsx')
{'friends': [{'name': 'bbb1', 'cls_no': 'ccc1', 'friends_new': 'bbb1--ccc1'}, {'name': 'bbb2', 'cls_no': 'ccc2', 'friends_new': 'bbb2--ccc2'}], 'name': 'a3'}
{'friends': [{'name': 'bb1', 'cls_no': 'cc1', 'friends_new': 'bb1--cc1'}, {'name': 'bb2', 'cls_no': 'cc2', 'friends_new': 'bb2--cc2'}], 'name': 'a2'}
{'friends': [{'name': 'b1', 'cls_no': 'c1', 'friends_new': 'b1--c1'}, {'name': 'b2', 'cls_no': 'c2', 'friends_new': 'b2--c2'}], 'name': 'a1'}