MongoDB: возвращаемое поле в дочерних документах, которое присутствует только в родительском?

У меня есть запрос Mongo DB, который возвращается в ожидаемом формате:

db.getCollection("myCollection").aggregate([
  {
    $lookup: {
      from: "myCollection",
      localField: "parent_id",
      foreignField: "parent_id",
      as: "children"
    }
  },
  { $unwind: "$children" },
  { $replaceWith: "$children" }
])

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

пример дочернего документа:

{
id: doc_123_2
parent_id: 123
active: true
}

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

{
_id: doc_123
parent_id: 123
active: true
parent_desc: sample parent desc
}

Как я могу изменить свой запрос для этого?

mongoplayground.net/p/I8GeRt7f9Md вот так?
cmgchess 16.04.2024 18:55

Я не думаю, что это обязательно будет чище, чем ответ @cmgchess ниже, но вот альтернатива, в которой слияние происходит в финальном преобразовании $replaceWith, а не внутри $lookup: mongoplayground.net/p/TnTA41zx6A3

user20042973 16.04.2024 19:20
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MongoDB: возвращаемое поле в дочерних документах, которое присутствует только в родительском?

Чтобы вернуть поле, присутствующее в родительском дочернем документе, вы можете использовать приведенный ниже код. Он использует addFields для добавления обязательного поля parent_desc в дочерний документ, как показано в выводе ниже:

db.getCollection("newcoll").aggregate([
  {
    $lookup: {
      from: "newcoll",
      localField: "parent_id",
      foreignField: "parent_id",
      as: "children"
    }
  },
  { $unwind: "$children" },
  { $replaceWith: "$children" },
  {
    $lookup: {
      from: "newcoll",
      localField: "parent_id",
      foreignField: "parent_id",
      as: "parent"
    }
  },
  { $unwind: "$parent" },
  {
    $addFields: {
      parent_desc: "$parent.parent_desc"
    }
  },
  {
    $group: {
      _id: "$_id",
      id: { $first: "$id" },
      parent_id: { $first: "$parent_id" },
      active: { $first: "$active" },
      parent_desc: { $first: "$parent_desc" }
    }
  },
  {
    $project: {
      _id: 1,
      id: 1,
      parent_id: 1,
      active: 1,
      parent_desc: 1
    }
  }
]).pretty()

Выход:

{
        "_id" : ObjectId("662616f0af88e119ac2f49c3"),
        "id" : "doc_123_2",
        "parent_id" : "123",
        "active" : true,
        "parent_desc" : "sample parent desc"
}
{
        "_id" : ObjectId("66261744af88e119ac2f49c4"),
        "id" : "doc_123",
        "parent_id" : "123",
        "active" : true,
        "parent_desc" : "sample parent desc"
}

Другие вопросы по теме