2

问题:我正在尝试在 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}}
])
4

2 回答 2

0

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

于 2022-02-17T21:02:31.580 回答
0

在完成 mongodb 操作之后,我可以通过以下不使用 $replaceRoot 的查询获得与我想要的结果类似的结果。事实证明这是一个更好的查询,我认为:

db.testCollection.aggregate([
    {$unwind: "$invoices"},
    {$project : {
        created_at: 1,
        seller: "$seller",
        buyer: "$invoices.buyer",
        nnf: "$invoices.nnf",
        receivable: '$invoices.receivables'
        }
    },
    {$unwind: "$receivable"},
    {$project : {
        _id: '$receivable._id',
        seller: 1,
        buyer: 1,
        invoice_code: 1,
        receivable: 1,
        created_at: 1,
     }
    },
    {$sort: {"created_at": -1}},
 ])

此查询产生以下结构列表:

[{
    "created_at" : ISODate("2020-03-06T09:47:26.161Z"),
    "seller" : {
        "name" : "Test name",
        "cnpj" : "21231232131232"
    },
    "buyer" : {
        "cnpj" : "21322132164654",
        "legal_name" : "Test name 2"
    },
    "invoice_code" : 66119,
    "receivable" : {
        "rec_code" : "001",
        "_id" : ObjectId("5e601bb5efff82b92935bad4"),
        "expiration_date" : ISODate("2020-03-17T00:00:00.000Z"),
        "value" : 6540.7,
        "situation" : {
            "status" : "active",
            "reason" : []
        }
    },
    "_id" : ObjectId("5e601bb5efff82b92935bad4")
}]
于 2020-03-10T19:32:43.583 回答