Агрегация MongoDB, чтобы проверить, содержится ли элемент в массиве - PullRequest
1 голос
/ 31 марта 2020

Я новичок в MongoDB, мой родной язык - испанский sh. Поэтому я не уверен, как найти то, что мне нужно.

Я постараюсь сделать себя понятным.

моя схема:

    let noticiaSchema = new Schema({
        titulo: {
            type: String,
            required: [true, 'El titulo de la noticia es requerido']
        },
        cuerpo_noticia: {
            type: String,
            required: [true, 'El cuerpo de la noticia es necesario']
        },
        publicacion_noticia: {
            type: Date,
            default: new Date()
        },
        actualizacion_noticia: {
            type: Date,
            default: new Date()
        },
        likes: {
            type: Array,
            default: []
        },
        foto: {
            type: String
        },
        dislikes: {
            type: Array,
            default: []
        }
    })

Пример Do c:

    {
        "_id" : ObjectId("5e81868faf9d6e084cc60cc8"),
        "titulo" : "fdsfsfs",
        "cuerpo_noticia" : "fdsfsfs",
        "actualizacion_noticia" : ISODate("2020-03-30T05:41:35.144Z"),
        "foto" : "14335143.png",
        "publicacion_noticia" : ISODate("2020-03-30T05:41:12.997Z"),
        "likes" : [ 
            "5e7ffb641650a326dcc1e1c7"
        ],
        "dislikes" : [],
        "__v" : 0
    }

Я в основном пытаюсь запросить массив элементов с именем likes, если элемент содержится в этом массиве, я бы хотел вернуть true / false в новое поле.

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

//5e7ffb641650a326dcc1e1c7  element to search
Noticia.aggregate([
{
    $match: {
        "likes": { "$in": ["5e7ffb641650a326dcc1e1c7"] },
        //likes is the array field with elements to search
    }
},
 {
     $project: {
        titulo: "$titulo"
    }
  }
 ], (err, trans) => {

})

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

Наконец, я хочу знать, есть ли способ вернуть результат по дате создания, то есть .sort {_id: -1}

1 Ответ

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

Если вы хотите вернуть все документы, вам не следует использовать $match, попробуйте использовать агрегацию ниже:

db.collection.aggregate([
   /** Add a field across all docs by checking on specific condition */
  {
    $addFields: {
      elementExists: {
        $cond: [{ $in: ["5e7ffb641650a326dcc1e1c7", "$likes"] }, true, false]
      }
    }
  },
  {
    $sort: {
      _id: -1 // Sort by '_id' field in descending order
    }
  }
]);

Тест: mongoDB-Playground

...