Использование $lookup в MongoDB

У меня есть следующие коллекции в базе данных mydb:

  • закупки: содержит документы в следующем формате:

    {
     _id: <ObjectId>,
     name: <String>, //customer name
     purchasedItems: <Array>
              0: < Object >
                  i_name: <String> // item name
                  qntity: <Int>
              // other objects in the array
    }
    
  • продажа: содержит документы в следующем формате:

    {
     _id: <ObjectId>,
     i_name: <String>,
     qntity: <Int>
     cost: <Int>
    }
    

Я хотел бы вывести новую коллекцию, которая содержит следующие документы:

    {
     _id: <ObjectId>,
     name: <String>,
     cost: <Int>
    }

Где имя - это имя клиента в коллекции покупок, а стоимость - это стоимость ВСЕХ предметов, которые он приобрел.

Формально стоимость каждого предмета определяется как:

покупки / покупка.квиты / продажи / продажа) * sales.cost

ГДЕ покупок.purchasedItems.i_name=sales.i_name

а стоимость в выходной коллекции - это сумма стоимости всех предметов.

Я пробовал следующее, но это не работает:

db.purchases.aggregate([
    {$unwind: "$purchasedItems"},
    {$lookup:
        {from:"sales",
        localField:"purchasedItems.i_name",
        foreignField:"i_name",
        as: "n_cost"}
    },
    {
        $group:{
               _id: "$_id",
               name: "$name",
               cost: {$sum: {multiply:[{$divide:["$n_cost.qntity","$qntity"]},"$n_cost.cost"]}}
        }
    },
    {$out: "results"}
])

Буду признателен за любую помощь в том, что я сделал неправильно, и как это правильно сделать.

1 ответ

Решение

Так что здесь есть пара неверных вещей.

Куча пропавших без вести и пропавших без вести $unwind после $lookup этап.

Пытаться

db.purchases.aggregate([
  {"$unwind":"$purchasedItems"},
  {"$lookup":{
    "from":"sales",
    "localField":"purchasedItems.i_name",
    "foreignField":"i_name","as":"n_cost"
  }},
  {"$unwind":"$n_cost"},
  {"$group":{
    "_id":"$_id",
    "name":{"$first":"$name"},
    "cost":{
      "$sum":{
        "$multiply":[
          {"$divide":["$purchasedItems.qntity","$n_cost.qntity"]},
          "$n_cost.cost"
        ]
      }
    }
  }},
  {"$out":"results"}
])

Без $unwind

db.purchases.aggregate([
  {"$lookup":{
    "from":"sales",
    "localField":"purchasedItems.i_name",
    "foreignField":"i_name",
    "as":"n_cost"
  }},
  {"$project":{
    "name":1,
    "cost":{
      "$sum":{
        "$map":{
          "input":{"$range":[0,{"$size":"$purchasedItems"}]},
          "as":"ix",
          "in":{
            "$let":{
              "vars":{
                "purchase":{"$arrayElemAt":["$purchasedItems","$$ix"]},
                "sales":{"$arrayElemAt":["$n_cost","$$ix"]}},
                "in":{
                  "$multiply":[
                    {"$divide":["$$purchase.qntity","$$sales.qntity"]},"$$sales.cost"
                  ]
                }
            }
          }
        }
      }
    }
  }},
  {"$out":"results"}
])
Другие вопросы по тегам