首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否对$or查询中的每个条件应用限制?

是否对$or查询中的每个条件应用限制?
EN

Stack Overflow用户
提问于 2015-09-21 11:35:53
回答 2查看 272关注 0票数 0

我有一个用流星编写的聊天室应用程序,使用的是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发布,所以我需要返回一个游标。

EN

回答 2

Stack Overflow用户

发布于 2015-09-22 04:13:35

您不能仅对结果集的一部分应用限制,因此实现此目的的唯一方法是使用多个订阅。下面是一些使用模板订阅的示例代码。您需要根据您的特定用例对其进行修改。

服务器

代码语言:javascript
复制
// 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);
});

客户端

代码语言:javascript
复制
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);
});
票数 0
EN

Stack Overflow用户

发布于 2015-09-21 13:58:58

我相信,简单地设置一个动态数量的.find(),每个房间一个,就可以解决这种情况。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32686958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档