MongoDB - Как вернуть совпавший элемент в массиве, используя $ in в $ group? - PullRequest
1 голос
/ 05 апреля 2020

Я использую агрегацию MongoDB.

Используя $in Я проверяю, существует ли значение в массиве или нет, И я хочу вернуть соответствующий объект из массива calificacion в calificacion_usuario поле. (мой _id является уникальным в массиве).

Я пытался использовать $first" для возврата текущего элемента. Это не работает, не знаю, зачем и что использовать.

Как я могу это сделать?

Пример Do c:

{
 "cargo" : "Presidente",
 "calificacion" : [ 
    {
        "_id" : "5e894ae6fa9fd23780bcf472",
        "estrellas" : 3
    }, 
    {
        "_id" : "5e895187fa9fd23780bcf478",
        "estrellas" : 5
    }
]}

Запрос:

    Politico.aggregate([
        {
            $group: {
                _id: "$cargo",
                nuevo_formato: {
                    $push: {
                        $mergeObjects: [
                            "$$ROOT",
                            {
                                "calificacion_promedio": { $avg: "$calificacion.estrellas" },
                                "calificacion_usuario": { $cond: [{ $in: [req.body.id_usuario, "$calificacion._id"] }, "$first", false] },
                                "calificacion_numero_encuestas": { $size: "$calificacion" }

                            }
                        ]
                    }
                }
            }
        },

1 Ответ

1 голос
/ 05 апреля 2020

$first не работает таким образом, вам нужно заменить $first на следующий код:

{
  $arrayElemAt: [ /** Get an element from 'calificacion' based on position */
    "$calificacion",
    {
      $indexOfArray: ["$calificacion._id", req.body.id_usuario], /** Check in which position 'req.body.id_usuario' exists (will be a number) */
    },
  ],
}

Тест: MongoDB-Playground

Ссылка: $ indexOfArray , $ arrayElemAt

...