我使用以下代码订阅了该出版物。所以在我的服务器端文件中
Meteor.publish('people', function() {
cursor = EmailDB.find({category:{$ne:"Spammer"}},{sort:{"lastMessage.date": -1},limit:20});
let transformData = (fields) => {
// this is the person we're processing now
let eadd = fields.eadd;
// get the latest message for this person
key.eadd = eadd;
let lastMessage = MessageDB.findOne(key,
{
sort: {date: -1}
}
);
// add his last message to the returned data
fields.lastMessage = lastMessage;
return fields;
};
let handle = cursor.observeChanges({
added: (id, fields) => {
fields = transformData(fields);
this.added('emails', id, fields);
},
changed: (id, fields) => {
fields = transformData(fields);
this.changed('emails', id, fields);
},
removed: (id) => {
this.removed('emails', id);
}
});
this.ready();
this.onStop(() => {
handle.stop();
});
return cursor;
}
它获取Person的所有记录。
我想获取每个人的最新消息。
所以我使用了上面的代码,但是它不起作用,它没有向我的查询中添加其他字段。
我只需要订阅并获取所有记录,并且在每个记录中必须有最后一条消息。
最佳答案
每当您想要从2个这样的已发布集合中合并数据时,都可以选择在客户端或服务器上进行处理。如果您在客户端上执行此操作,则说明您已经为自己创建了一个竞争条件。它可以解决,但是我发现它在服务器上更干净,更容易。由于您只需要订阅一个集合,因此它在客户端上变得非常简单。
因此,要在服务器上进行操作,可以在发布中进行处理。在这里,您可以转换返回的集合(PersonDB)并向其中添加数据(MessagesDB)。
我不知道您的收藏集是什么样的,或者它们的命名方式,所以我显然在这里做一些假设。
Meteor.publish('people', function() {
let cursor = PersonDB.find({});
let transformData = (fields) => {
// this is the person we're processing now
let personId = fields.personId;
// get the latest message for this person
let lastMessage = MessagesDB.findOne({personId: personId},
{
sort: {createdAt: -1}
}
);
// add his last message to the returned data
fields.lastMessage = lastMessage;
return fields;
};
let handle = cursor.observeChanges({
added: (id, fields) => {
fields = transformData(fields);
this.added('personsdb', id, fields);
},
changed: (id, fields) => {
fields = transformData(fields);
this.changed('personsdb', id, fields);
},
removed: (id) => {
this.removed('personsdb', id);
}
});
this.ready();
this.onStop(() => {
handle.stop();
});
});
在客户端上,您可以像平常一样订阅PersonDB,并像平常一样进行查找,现在在每个记录上都将附加一个“ lastMessage”字段。
关于javascript - 选择集合并在MongoDB中获取其他集合中每个项目的最后一项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41503019/