MongoDB возвращает объект из $ filter - PullRequest
2 голосов
/ 14 января 2020

Поле потребителя - это массив с двумя объектами. С $filter один объект удален, но мне нужно, чтобы потребитель был объектом в конце, но теперь это массив с одним объектом. Я пытался $arrayToObject, но не могу добраться до работы. Как вернуть потребителю объект?

   {
      $project: {
        messages: 1,
        authors: { $concatArrays: ["$userName", "$storeName"] },
        consumer: {
          $filter: {
            input: { $concatArrays: ["$userName", "$storeName"] },
            as: "authors",
            cond: { $ne: ["$$authors._id", req.user._id] }
          }
        },
      }
    }

1 Ответ

2 голосов
/ 14 января 2020

Попробуйте это:

{
    $project: {
        messages: 1,
            authors: { $concatArrays: ["$userName", "$storeName"] },
        consumer: {
            $arrayElemAt: [{
                $filter: {
                    input: { $concatArrays: ["$userName", "$storeName"] },
                    as: "authors",
                    cond: { $ne: ["$$authors._id", req.user._id] }
                }
            }, 0]
        }
    }
}

Вы можете использовать $ arrayElemAt непосредственно сразу после $filter вместо дополнительной стадии $unwind, $filter обычно возвращает массив совпадающие объекты или [], если ничего не найдено, поэтому, если вы используете $unwind, вам нужно использовать его { $unwind: { path: "$consumer", preserveNullAndEmptyArrays: true } }, в противном случае есть вероятность потери документов (у которых consumer как []) в конечном ответе агрегации Пожалуйста, прочитайте больше об этом здесь: $ unwind . Поэтому я бы предпочел $arrayElemAt над $unwind.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...