Как я могу ограничить возвращаемые элементы из массива Mongoose? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть модель, которую мы используем для разговорного чата, которая использует вложенные массивы. Каждый раз, когда пользователь отправляет сообщение, оно помещается в массив сообщений. Это моя модель:

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

const ConversationSchema = new Schema({
  sender: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  messages: [
    {
      message: String,
      meta: [
        {
          user: {
            type: Schema.Types.ObjectId,
            ref: 'User'
          },
          delivered: Boolean,
          read: Boolean
        }
      ]
    }
  ],
  is_group_message: { type: Boolean, default: false },
  participants: [
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: 'User'
      },
      delivered: Boolean,
      read: Boolean,
      last_seen: Date
    }
  ]
}, { timestamps: true });

module.exports = mongoose.model('Conversation', ConversationSchema);

Я пытаюсь найти все разговоры, частью которых является пользователь, но я не могу вернуть только самое последнее сообщение чата, и кажется, что параметры игнорируются. Это проблема с моделью или с моей стороны?

Conversation.find({ 'participants.user': { $all: [req.user._id] } })
    .sort('-createdAt')
    .populate({
      path: 'sender',
      select: '-_id -password -email -lastLogin -createdAt -updatedAt -__v',
    })
    .populate({
      path: 'messages.meta.user',
      select: 'username avatar',
      options: {
        limit: 1
      }
    })
    .populate({
      path: 'participants',
      path: 'participants.user',
      select: 'username avatar'
    })
    .then(conversation => {
      if (!conversation) {
        errors.noconversation = 'No conversation could be found';
        return res.status(404).json(errors);
      }
      res.json(conversation)
    })
    .catch(err => res.status(404).json({ conversation: 'There are no conversations or an error occurred' }));
...