Запрос MongoDB - раскрутить и сопоставить с сохранением нулевого ИЛИ другого значения / добавить новое поле на основе условия - PullRequest
1 голос
/ 18 марта 2020

Если a имеет следующую структуру:

{
    _id: 1,
    name: 'a',
    info: []
},
{
    _id: 2,
    name: 'b',
    info: [
        {
            infoID: 100,
            infoData: 'my info'
        }
    ]
},
{
    _id: 3,
    name: 'c',
    info: [
        {
            infoID: 200,
            infoData: 'some info 200'
        },
        {
            infoID: 300,
            infoData: 'some info 300'
        }
    ]
}

Мне нужно запросить таким образом, чтобы получить документы, в которых infoID равен 100 , показывая infoData, или ничего если информация пуста или содержит вложенные документы с infoID, отличным от 100.

То есть, я бы хотел получить следующий вывод:

{
    _id: 1,
    name: 'a',
    infoData100: null
},
{
    _id: 2,
    name: 'b',
    infoData100: 'my info'
},
{
    _id: 3,
    name: 'c',
    infoData100: null
}

Если I $unwind от info и $match на infoID: 100, я теряю записи 1 и 3.

Спасибо за ваши ответы.

1 Ответ

1 голос
/ 18 марта 2020

Попробуйте запрос ниже:

Запрос:

db.collection.aggregate([
  /** Adding a new field or you can use $project instead of addFields */
  {
    $addFields: {
      infoData100: {
        $cond: [
          {
            $in: [100, "$info.infoID"] // Check if any of objects 'info.infoID' has value 100
          },
          {
            // If any of those has get that object & get infoData & assign it to 'infoData100' field
            $let: {
              vars: {
                data: {
                  $arrayElemAt: [
                    {
                      $filter: {
                        input: "$info",
                        cond: { $eq: ["$$this.infoID", 100] }
                      }
                    },
                    0
                  ]
                }
              },
              in: "$$data.infoData"
            }
          },
          null // If none has return NULL
        ]
      }
    }
  }
]);

Тест: MongoDB-Playground

...