Правильное использование $replaceRoot в запросе MongoDB

#mongodb #mongodb-query #aggregate

Вопрос:

У меня есть экземпляр MongoDB с 3 таблицами, построенными следующим образом:

  • Компания {_id, [productIds], фу, бар, …}
  • Продукт {_id, productCategoryId, foo, бар, …}
  • Категория продукта {_id, foo, бар, …}

Мне нужен результат, который возвращает все данные компании с дополнительным полем. Это должно содержать все данные о продукте (так что в основном это объединение в productIds). Каждый продукт должен быть объединен со своей категорией.

Я получил следующий запрос по этому поводу:

 db.companyentities.aggregate([  {  $unwind: "$productIds"  },  {  $lookup: {  as: "products",  foreignField: "_id",  from: "productentities",  localField: "productIds"  }  },  {  $unwind: "$products"  },  {  $lookup: {  as: "products.productCategory",  foreignField: "_id",  from: "productcategoryentities",  localField: "products.productCategoryId"  }  },  {  $unwind: "$products.productCategory"  },  {  $group: {  _id: "$_id",  products: {  $push: "$products"  },  detail: {  $first: "$ROOT"  }  }  },  {  $replaceRoot: {  newRoot: {  $mergeObjects: [  {products: "$products"},  {detail: "$detail"}  ],  }  }  } ])  

Я правильно понял соединения, проблема в том, что результат имеет формат {идентификатор компании, сведения: {Данные компании}, продукты { Данные продукта }}.

Мне нужны данные о компании, как в базе данных, но с дополнительным столбцом, содержащим данные о продукте.

Как мне этого добиться? Я думаю, что я делаю что-то не так со $replaceRoot своей стороны.

Заранее спасибо за любые предложения 🙂

Комментарии:

1. Вместо {detail: "$detail"} этого попробуйте просто "$detail"

Ответ №1:

Ответ @Joe был правильным, спасибо 🙂

Вместо {detail: «$detail»} попробуйте просто «$detail»

Комментарии:

1. На самом деле это не ответ — пожалуйста, поднимите голос и примите вместо этого ответ @Joe.

2. @JohnFF Мне жаль, что я пытался, но так как он ответил как комментарий, а не как ответ, я не знаю, как это сделать :гримасничать: