конвейер агрегации mongodb, объединяющий две коллекции с необходимыми критериями $ match - PullRequest
0 голосов
/ 13 сентября 2018

Здравствуйте, у меня есть две коллекции (продукт и заказ), и я пытаюсь создать агрегацию, которая приведет к тому, что все продукты будут перечислены для конкретного поставщика, а количество данных из определенного заказа будет добавлено к данным, если заказ содержит это конкретный продукт в нем.

Product Collection

{
    _id: objectId,
    supplierId: objectId1,          // supplier 1
    sku: "prod1"
},
{
    _id: objectId,
    supplierId: objectId1,          // supplier 1
    sku: "prod2"
},
{
    _id: objectId,
    supplierId: objectId1,          // supplier 1
    sku: "prod3"
}
{
    _id: objectId,
    supplierId: objectId2,          // supplier 2
    sku: "prod4"
},
{
    _id: objectId,
    supplierId: objectId2,          // supplier 2
    sku: "prod5"
}

Order Collection

{
    _id: objectId5      // order 1
    product: [{
        _id: objectId,
        supplierId: objectId1,
        sku: prod1,
        qty: 5

    },
    {
        _id: objectId,
        supplierId: objectId1,
        sku: prod2,
        qty: 1
    }]
},
{
    _id: objectId6      // order 2
    product: [{
        _id: objectId,
        supplierId: objectId1,
        sku: prod1,
        qty: 100

    }, ...
    ]
}


result should be

{
    _id: objectId,
    supplierId: objectId1,      // supplier 1
    sku: "prod1",
    qty: 5
},
{
    _id: objectId,
    supplierId: objectId1,      // supplier 1
    sku: "prod2",
    qty: 1
},
{
    _id: objectId,
    supplierId: objectId1,      // supplier 1
    sku: "prod3",
    qty: 0 || null
}

Я не слишком далеко продвинулся в своей попытке, но записал какой-то псевдокод относительно того, где находится моя голова с этой проблемой. Я не сомневаюсь, что просто сделаю то, что нужно сделать здесь, но любая помощь будет принята с благодарностью.

  product.aggregate([{$match: {supplierId: objectId1}},
     {$lookup: {join order collection but only where orderId: objectId5}},
     {$projection: {append qty where there is one append to each product that matches.  prodcuts that don't match append 0 or null}}
    ])

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете попробовать агрегацию ниже с $lookup конвейером в версии 3.6.

$ lookup pipe

db.products.aggregate([
  {"$match":{"supplierId":objectId1}},
  {"$lookup":{
    "from":"orders",
    "let":{"supplierId":"$supplierId","sku": "$sku"},
    "pipeline":[
      {"$match":{"_id":objectId5, "$expr":{"$and":[{"$in":["$$supplierId","$product.supplierId"]},{"$in":["$$sku","$product.sku"]}]}}},
      {"$unwind":"$product"},
      {"$match":{"$expr":{"$and":[{"$eq":["$$supplierId","$product.supplierId"]},{"$eq":["$$sku","$product.sku"]}]}}}       
    ],
    "as":"mproduct"
  }},
 {"$replaceRoot":{"newRoot":{"$mergeObjects":["$$ROOT",{"$cond":[{"$ne":["$mproduct",[]]},{"qty":{"$arrayElemAt":["$mproduct.product.qty",0]}},{"qty":0}]}]}}},
 {"$project":{"mproduct":0}}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...