MongoDB: удалить поле в массиве с помощью $lookup localField

#mongodb

#mongodb

Вопрос:

Я новичок в MongoDB. Я использую $lookup in aggregation и использую localField для получения справочного документа.

 db.orders.insert([
   { "_id" : 1, "item" : ['almonds','pecans','bread'], "price" : 12, "quantity" : 2 },
   { "_id" : 2, "item" : ['cashews','catty'], "price" : 20, "quantity" : 1 }
])
  

Я пытался использовать $lookup и localField в aggregation , но я не могу найти способ удалить поле _id и description

 db.inventory.insert([
   { "_id" : 1, "sku" : "almonds", description: "product 1", "instock" : 120 },
   { "_id" : 2, "sku" : "bread", description: "product 2", "instock" : 80 },
   { "_id" : 3, "sku" : "cashews", description: "product 3", "instock" : 60 },
   { "_id" : 4, "sku" : "pecans", description: "product 4", "instock" : 70 },
   { "_id" : 5, "sku": "catty", description: "Incomplete", "instock" : 100 },
   { "_id" : 6 }
])
  

Ожидаемые результаты:

 [
   {
    "_id" : 1,
    "item" : [
        { "sku" : "almonds", "instock" : 120 },
        { "sku" : "pecans", "instock" : 70 },
        { "sku" : "bread", "instock" : 80 }
    ],
    "price" : 12,
    "quantity" : 2
    },
   {
    "_id" : 2,
    "item" : [
        { "sku" : "cashews", "instock" : 60 },
        { "sku" : "catty", "instock" : 100 }
    ],
    "price" : 20,
    "quantity" : 1
    }
]
  

Ответ №1:

Вы можете попробовать поиск с помощью конвейера агрегации,

  • $lookup присоединиться к коллекции инвентаря
  • $match для соответствия используется инвентарь sku в item массиве
  • $project для отображения обязательных полей
 db.orders.aggregate([
  {
    $lookup: {
      from: "inventory",
      as: "item",
      let: { i: "$item" },
      pipeline: [
        { $match: { $expr: { $in: ["$sku", "$$i"] } } },
        {
          $project: {
            _id: 0,
            sku: 1,
            instock: 1
          }
        }
      ]
    }
  }
])
  

Игровая площадка