Какая альтернатива $ replace Root на mongoDB? $ replace Root несовместим с documentDB - PullRequest
0 голосов
/ 10 марта 2020

Проблема: я пытаюсь сделать запрос на MongoDB, но я использую DocumentDb из amazon, где некоторые операции не поддерживаются. Я хотел найти альтернативу, чтобы получить тот же результат, если это возможно. По сути, я хочу изменить root результата, вместо того, чтобы быть первой сущностью, мне нужно, чтобы это было некоторое слияние некоторых значений на разных уровнях документа.

Итак, у меня есть следующая структура в моей коллекции:

{
    "_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"
    }
}]

Это можно сделать с помощью $ replace Root в запросе ниже на MongoDB, но с использованием documentDB я не могу использовать $ replace Root или $ 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}}
])

1 Ответ

0 голосов
/ 10 марта 2020

Пройдя через операции mongodb, я мог получить аналогичный результат со следующим запросом без $ replace Root. Оказывается, это был лучший запрос, я думаю:

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")
}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...