我正在用 Meteor 构建一个简单的消息传递应用程序。我在未读消息中苦苦挣扎的部分。我想返回一个列表,显示用户名(我不关心这个,请不要关注这个方面,围绕反应连接/复合等)和来自该用户的最新消息 我需要返回什么,在下面的发布功能中,是最新的未读消息,但显然每个唯一用户 ID 中只有一条。
为此,我试图在我的发布方法中操纵查找查询的结果,但我不清楚如何在不破坏反应性的情况下操纵文档集,正如我目前在下面的代码中所示,这就是我到目前为止:
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.
});
我意识到我的下划线函数当然正在使用并且确实返回一个数组而不是我需要的反应光标。我知道一种解决方案是简单地提取消息 ID,然后在消息上运行另一个 .find,但是是否有另一种/更好/更有效/更自然的方式来返回带有我正在寻找的结果集的游标?