对$或查询中的每个条件应用限制?

时间:2015-09-21 03:35:53

标签: mongodb meteor

我使用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出版物发布,所以我需要返回一个光标。

2 个答案:

答案 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,每个房间一个,就可以解决这个问题。