MongoDB 对象数组中批量添加字段

原文链接: 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'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值