我有一个用流星编写的聊天室应用程序,使用的是MongoDB。每个聊天室包含多条消息,一个用户可以加入多个聊天室。我想创建一个查询,从每个聊天室获取给定用户所在的所有聊天室的200条最新消息。我正在做这样的事情:
// These are the ids of the chatrooms the user is currently in var conditions = [{chatroomId: 1}, {chatroomId: 2}]; Messages.find({$or: conditions}, {sort: {createdAt: -1}, limit: 200});
但是,这一限制自然适用于整个查询;因此,用户最终可能会收到来自一个房间的180条消息和来自另一个房间的20条消息。更糟糕的是,随着新消息的添加,剔除旧消息的房间是不一致的。
我可以随着用户加入更多聊天室而增加限制,但这可能会导致他们在两个聊天室中有5条消息,在第三个聊天室中有590条消息。
是否有一种方法可以将切片或限制应用于或中的每个条件?我将这个作为Meteor发布,所以我需要返回一个游标。
发布于 2015-09-22 04:13:35
您不能仅对结果集的一部分应用限制,因此实现此目的的唯一方法是使用多个订阅。下面是一些使用模板订阅的示例代码。您需要根据您的特定用例对其进行修改。
服务器
// Returns a limited set of messages for one specific chat room.
Meteor.publish('messages', function(chatroomId, limit) {
check(chatroomId, String);
check(limit, Number);
var options = {sort: {createdAt: -1}, limit: limit};
return Messages.find({chatroomId: chatroomId}, options);
});客户端
Template.myTemplate.helpers({
messages: function() {
// Read all of the messages (you may want to restrict these by room),
// sort them, and return the first 100 across all.
return _.chain(Messages.find().fetch())
.sortBy(function(message){return -message.createdAt.getTime();})
.first(100)
.value();
}
});
Template.myTemplate.onCreated(function() {
// Subscribe to multiple chat rooms - here we are assuming the ids are
// stored in the current context - modify this as needed for your use case.
this.subscribe('messages', this.chatroomId1, 100);
this.subscribe('messages', this.chatroomId2, 100);
});发布于 2015-09-21 13:58:58
我相信,简单地设置一个动态数量的.find(),每个房间一个,就可以解决这种情况。
https://stackoverflow.com/questions/32686958
复制相似问题