MongoDB $in操作符数组的最大长度

5
在Meteor中,我使用MongoDB来存储一个对象集合,大约有500k条记录。我使用Objets.find({ "_id": { "$in": objIds } });,其中objIds是一个_id数组。当数组长度为1000时,它可以正常工作,但当我尝试使用13145个_id时,应用程序停止响应。
显然,_id字段已经建立了索引,而且这种搜索可能永远不会发生,但我不确定这是否是正常行为。$in运算符是否有最大长度限制?在文档中找不到相关信息。
这是我在Meteor中发布的代码:
Meteor.publish('objetsByIds', function objetsByIdsPublication(objIds) {
      return Objets.find({ "_id": { "$in": objIds } });
  })

1
任何文档(包括MongoDB中的查询文档)的大小都有16兆字节的限制。由于每个ObjectId占用12个字节,因此13145个ObjectId不应超过该限制。您如何迭代结果?如果您将所有13145个ObjectId读入内存,则可能会遇到内存限制问题。 - jstell
我只是返回结果,因为它用于Meteor订阅。我可能已经耗尽了内存,但我很惊讶在控制台中没有从Meteor得到异常。 - Paperbag Writer
你是想做一个join吗?在客户端(minimongo)还是在服务器端?能否展示一下你的方法或者发布内容? - Michel Floyd
在客户端,我只是接收游标而不进行任何连接。我已经在问题中添加了我的代码。在客户端,我使用fetch()获取结果,但可能太多了。但是,在获取之前,我放置了一个console.log(“blabla”),但它根本没有打印出来,因此显然它甚至没有到达客户端。 - Paperbag Writer
1个回答

1
我不太了解Meteor,但是,当检索大量数据时,MongoDB使用游标,而Meteor如何处理取决于驱动程序的实现。
虽然您可以查看游标here,但我想到的另一个想法是分割查询。因此,如果您知道1000个文档能够正常工作,请使用mod制作循环,使结果每次包含1000个文档。

Meteor 也使用游标。我认为分页可能仍然是可行的方法。 - Paperbag Writer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接