使用Mongodb存储一个非常大的“黑名单”ID列表

时间:2011-06-09 04:37:46

标签: ruby mongodb mongoid

我需要在mongo中将无序的ID列表存储为“黑名单”,并将其用于检查原因。

blacklisted_ids= [1,23......100002942234... some very large number]

但是将其存储在单个文档中是不可行的,因为我将非常快地超过2Mb限制。

我可以在mongodb中创建一个集合,并将每个id作为文档插入,但看起来有点矫枉过正,因为我想要的就是检查是否存在。

这样做的正确方法是什么?

注意:我使用的是mongoid / rails。 =)

1 个答案:

答案 0 :(得分:5)

这些ID是整数吗? Mongo的文档大小限制在版本1.8中提高到16 MB,因此您应该可以在单个文档中使用它来容纳几百万个整数。

如果这仍然不足以满足您的需求,我认为新系列根本不会过度。请确保使用'_id'字段存储您关心的ID,以免浪费任何磁盘空间:

class BlacklistedId
  include Mongoid::Document
  identity :type => Integer
end

此外,当您查询它时,请确保执行以下操作:

BlacklistedId.where(:_id => 78943).only(:_id).first
# A result means it's blacklisted, nil means it's not.

通过告诉Mongo您只想返回_id字段,它将直接从_id索引提供您的查询,并且不会费心去寻找磁盘上的实际文档。这将使事情变得活泼,并且还意味着Mongo不需要将实际集合保留在RAM中 - 只是索引中的值。