$ merge сохраняет только один документ, а не весь извлеченный документ: mongodb - PullRequest
0 голосов
/ 19 февраля 2020

Вот мой запрос

 db.orders.aggregate([
                {
                '$match': {
                         'date': ISODate("2020-02-11T18:30:00Z")
                }},
                {
                '$unwind': {
                        'path': '$orders',
                 }}, 
                {
                 $lookup:
                   {
                        from: 'retailprice',
                        let: { productCode: '$orders.productCode' },
                        pipeline: [
                        {
                                $match: {
                                frequency: 'FR',
                                $expr: {
                                        $eq: ["$productCode", "$$productCode"]
                                     }
                                  }
                        }
                        ], as: 'retailprices'
                    }
                },
                { '$unwind': '$retailprice' },
              {
                $lookup:
                     {
                        from: 'discounts',
                        let: { productCode: '$orders.productCode' },
                        pipeline: [
                        {
                                $match: {
                                frequency: 'FR',
                                $expr: {
                                        $eq: ["$productCode", "$$productCode"]
                                }
                             }
                        }
                        ], as: 'discounts'
                }},
                { '$unwind': '$discounts' },
                {
                        '$project':{
                        'productCode':'$orders.productCode' ,
                        'vendorId':'$vendorId',
                        'dealerId':'$dealerId',
                        'quantity':'$orders.quantity'
                        } 
                },{'$merge':'test'}
        ]).pretty()

Таким образом, результат этого запроса без {'$merge':'test'}:

 {
    "_id" : ObjectId("5e3a710af2657521e8c5668a"),
    "productCode" : "TCE1",
    "vendorId" : ObjectId("5e3d05ba964d0e06c4bb0f07"),
    "dealerId" : ObjectId("5e1d82156a67173cb877f67d"),
    "quantity" : 30,
   }
 {
    "_id" : ObjectId("5e3a710af2657521e8c5668a"),
    "productCode" : "ECE1",
    "vendorId" : ObjectId("5e3d05ba964d0e06c4bb0f07"),
    "dealerId" : ObjectId("5e1d82156a67173cb877f67d"),
    "quantity" : 67,
   }

Но когда я использую {'$merge':'test'}, чтобы сохранить вывод в Новая коллекция сохраняет только один документ:

{
    "_id" : ObjectId("5e3a710af2657521e8c5668a"),
    "dealerId" : ObjectId("5e1d82156a67173cb877f67d"),
    "productCode" : "ECE1",
    "quantity" : 67,
    "vendorId" : ObjectId("5e3d05ba964d0e06c4bb0f07")
 }

. Почему это так? Я предполагаю, потому что "_id":ObjectId("5e3a710af2657521e8c5668a") одинаково в обоих документах, если проверяется вывод запроса, если это так, как его можно решить. Как можно сохранить оба документа с помощью $merge, я не хочу использовать $out, поскольку он заменяет весь документ при каждом повторном выполнении запроса, или, скорее, как я могу сохранить все извлеченные документы в новую коллекцию

1 Ответ

0 голосов
/ 19 февраля 2020

Вы правы, когда думаете о проблеме _id: на этапе $ unwind создается один документ на элемент массива с одинаковым _id (который, как и другие поля, реплицируется из исходного документа). .. очень просто! Добавьте «_id»: 0 к вашей стадии $ проекта. Затем mongodb создаст новую _id при вставке $ merge.

...
        {
                '$project':{
                '_id':0,
                'productCode':'$orders.productCode' ,
                'vendorId':'$vendorId',
                'dealerId':'$dealerId',
                'quantity':'$orders.quantity'
                } 
        },
...

Но обратите внимание, что таким образом mongoDB будет всегда создавать новую вставку и никогда не обновлять существующий. Если вам нужно более точное поведение, проверьте свойства $ merge

...