Я создаю простое приложение для обмена сообщениями с Meteor. Раздел, с которым я борюсь в непрочитанных сообщениях. Я хотел бы вернуть список, показывающий имя пользователя (меня это не волнует, пожалуйста, не сосредотачивайтесь на этом аспекте, вокруг реактивных объединений/композитов и т. д.) и последнее сообщение от этого пользователя Следовательно, в функции публикации ниже мне нужно вернуть самые новые непрочитанные сообщения, НО очевидно, только одно от каждого уникального идентификатора пользователя.
чтобы сделать это, я пытаюсь манипулировать результатами запроса поиска в моем методе публикации, но я не понимаю, как манипулировать набором документов, не нарушая реактивность, как я показал в настоящее время в коде ниже, это то, что у меня пока:
Meteor.publish('unreadmessages', function() {
if (!this.userId) {
throw new Meteor.Error('denied', 'not-authorized');
}
var messageQuery, messages, userGroupQuery, userGroups;
var self = this;
var user = Meteor.users.findOne(self.userId);
var userIdArr = [self.userId]; // for use where queries require an array
var contacts = user.contacts;
// get groups
userGroupQuery = Groups.find({
$or : [
{ owner : self.userId },
{ members : self.userId }
]
}, { // Projection to only return the _id field
fields : { _id:1 }
}
);
userGroups = _.pluck(userGroupQuery.fetch(), '_id'); // create an array of id's
messages = Messages.find({
$or : [
{
$and : [
{ participant : self.userId },
{ userId : { $in : contacts } },
{ readBy : { $nin : userIdArr } }
]
},
{
$and : [
{ groupId : { $in : userGroups } },
{ readBy : { $nin : userIdArr } }
]
},
]
});
// TODO : also handle groups here
uniqueMessages = _.uniq(messages.fetch(), function(msg) {
return msg.userId;
});
return uniqueMessages; // obviously an array and not a cursor - meteor errors out.
});
я понимаю, что моя функция подчеркивания, конечно же, работает и действительно возвращает массив, а не реактивный курсор, который мне нужен. я знаю, что одним из решений было бы просто вытащить идентификаторы сообщений, а затем запустить другой .find для сообщений, но есть ли другой / лучший / более эффективный / более естественный способ вернуть курсор с набором результатов, который я ищу?