首页 > 解决方案 > mongoDB 上 $​​replaceRoot 的替代方法是什么?$replaceRoot 与 documentDB 不兼容

问题描述

问题:我正在尝试在 MongoDB 上进行查询,但我使用的是来自亚马逊的DocumentDb,其中不支持某些操作。如果可能的话,我想找到一种替代方法来获得相同的结果。基本上我想改变结果的根,而不是成为第一个实体,我需要它是文档不同级别的一些值的一些合并。

所以,我的收藏中有以下结构:

{
    "_id" : ObjectId("5e598bf4d98f7c70f9aa3b58"),
    "status" : "active",
    "invoices" : [ 
        {
            "_id" : ObjectId("5e598bf13b24713f50600375"),
            "value" : 1157.52,
            "receivables" : [ 
                {
                    "situation" : {
                        "status" : "active",
                        "reason" : []
                    },
                    "rec_code" : "001",
                    "_id" : ObjectId("5e598bf13b24713f50600374"),
                    "expiration_date" : ISODate("2020-03-25T00:00:00.000Z"),
                    "value" : 1157.52
                }
            ],
            "invoice_code" : 9773,
            "buyer" : {
                "legal_name" : "test name",
                "buyer_code" : "223132165498797"
            }
        },
    ],
    "seller" : {
        "code" : "321654897986",
        "name" : "test name 2"
    }
}

我想要实现的是像这样列出所有“应收账款”,其中_id是应收账款的_id:

[{
    "_id" : ObjectId("5e598bf13b24713f50600374"),
    "situation" : {
        "status" : "active",
        "reason" : []
    },
    "rec_code" : "001",
    "expiration_date" : ISODate("2020-03-25T00:00:00.000Z"),
    "value" : 1157.52,
    "status" : "active",
    "seller" : {
        "cnpj" : "321654897986",
        "name" : "test name 2"
    },
    "invoice_code" : 9773.0,
    "buyer" : {
        "legal_name" : "test name",
        "cnpj" : "223132165498797"
    }
}]

我可以使用 $replaceRoot 在 MongoDB 上的以下查询中执行此操作,但使用 documentDB 我不能使用 $replaceRoot 或 $mergeObjects。你知道我怎样才能得到与其他运营商相同的结果吗?:

db.testCollection.aggregate([
   { $unwind: "$invoices" },
   { $replaceRoot: { 
       newRoot: {
           $mergeObjects: ["$$ROOT","$invoices"]}
       }
   },
   {$project: {"_id": 0, "value": 0, "created_at": 0, "situation": 0}},
   { $unwind: "$receivables" },
   { $replaceRoot: { 
       newRoot: {
           $mergeObjects: ["$receivables", "$$ROOT"]
           }
       }
   },
   {$project:{"created_at": 0, "receivables": 0, "invoices": 0}}
])

标签: mongodbaws-documentdb-mongoapi

解决方案


2021 年 1 月,Amazon DocumentDB 增加了对 $replaceRoot 的支持。


推荐阅读