我使用MongoDB在Meteor中编写了一个聊天室应用程序。每个聊天室都包含许多消息,用户可以加入多个聊天室。我想创建一个查询,从每个聊天室中获取给定用户所在的所有聊天室中的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出版物发布,所以我需要返回一个光标。
答案 0 :(得分:0)
您不能仅对结果集的一部分应用限制,因此实现此目的的唯一方法是使用多个订阅。这是使用模板订阅的一些示例代码。您需要根据具体用例对其进行修改。
服务器强>
// 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);
});
答案 1 :(得分:-1)
我相信只需拥有动态数量.find()
s,每个房间一个,就可以解决这个问题。