【发布时间】:2015-09-22 12:01:40
【问题描述】:
我有一个使用 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 条消息。
有没有办法对 or 中的每个条件应用切片或限制?我将其作为 Meteor 出版物发布,因此我需要返回单个光标。
【问题讨论】:
-
您不能这样做,因为“限制”适用于整个结果集,而不仅仅是选择中的单个条件。正如您应该能够想象的那样,您实际上想要几个查询的组合结果。您可以使用
async.concat或任何其他形式来执行此服务器端,您可以将多个查询的结果组合在一起,最好是并行执行。但这确实意味着几个查询。使用 `.aggregate() 是“可能的”,但这确实意味着保留整个列表,然后删除结果。不适合 200 件商品 -
不幸的是,如果您在一个数组中返回多个游标,它们当前必须都来自不同的集合。否则,您可能只是将每个聊天室的游标推入一个数组并返回游标数组。 Meteor 希望“在未来解除限制”。