Передача идентификатора объекта во вложенный массив MongoDB / Mongoose - PullRequest
0 голосов
/ 24 октября 2018

, поэтому я пытаюсь создать простую систему Thumbs Up для приложения, над которым я работаю, но у меня возникают проблемы с переносом идентификатора пользователя в массив likes.Вот как выглядит мой код:

Схема помещения

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const classroomSchema = Schema({
    clName: String,
    clPosts: [{
        title: String,
        mssg: String,
        date: String,
        imageurl: String,
HERE==> likes: [{type: Schema.Types.ObjectId, ref: 'User'}] 
    }]
})

const Classroom = mongoose.model('Classroom', classroomSchema)
module.exports = Classroom

router

router.put('/put/classroom/post/like/:id', (req, res, next) => {
    var data = data = req.body
    Classroom.findByIdAndUpdate(
        {
            _id: req.params.id,
            "clPosts": { _id: data.post }
        },
        { $push: { "clPosts.$[outer].likes": [data.user] } },
        { "arrayFilters": [{ "outer._id": data.post }] }
    ).then((room) => {
         console.log("Done"); 
         res.json(room);
    }).catch(next)
})

Я попробовал следовать другим советам здесь на SO, но я не уверенесли я что-то настроил неправильно или есть лучший способ поместить объект во вложенный массив.

Базовая настройка - это Коллекция Классов, содержащая Объекты Классов.в классе есть posts массив объектов, а внутри - likes массив.Идея заключается в том, что всякий раз, когда кому-то нравится пост, он сохраняет ObjectID этого пользователя в массиве, который я затем использую, чтобы подсчитать, сколько лайков и т. Д.MongoDB не имеет хорошей документации по вложенным массивам.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

clPosts - это поддокумент.Вы запрашиваете сообщения по _id -> "clPosts": { _id: data.post }, но я считаю, что запрос должен выглядеть следующим образом: "clPosts._id": { _id: data.post_id }

Поскольку вы используете mongoose, вы можете сделать это:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ClassRoomPostsSchema = new Schema({
    title: String,
    mssg: String,
    date: String,
    mageurl: String,
    likes: [] // you will push ids here or else, if you need to store more data, e.g. date/time when like was given, create a schema for Likes e.g. likes: [likeSchema.schema]
})

const ClassRoomSchema = new Schema({
    clName: String,
    clPosts: [ClassRoomPostsSchema.schema]
})

Тогда в вашем коде:

router.put('/put/classroom/post/like/:id', (req, res, next) => {
  ClassRoom.findOne({_id: req.params.id}, function(err, room) {
    if (err) return next(err);

    if (!room) return res.status(404).send('Classroom not found');

    //Find a post by id
    let post = ClassRoom.clPosts.id(data.post); // -> data.post_id

    if (!post) return res.status(404).send('Post not found');

    // Here you can push ids, but what is the idea behind? Maybe it makes more sense to count likes or push Like schemas (subdocument) to the array, e.g. post.likes.push(new Like(data));        
    post.likes.push();

    room.save(function(err) {
      if (err) return serverValidationError(req, res, err);
      res.status(200).send('success');
    });
  });      
})
0 голосов
/ 24 октября 2018

Попробуйте вот так

Classroom.findByIdAndUpdate(
        {
            _id: req.params.id,
            "clPosts._id": data.post
        },
        { $push: { "clPosts.$.likes": [data.user] } }
    ).then((room) => {
         console.log("Done"); 
         res.json(room);
    }).catch(next)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...