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

min*_*eow 2 ruby mongodb mongoid

我需要在mongo中将无序的ID列表存储为"黑名单",并将它们纯粹用于检查原因.

blacklisted_ids= [1,23......100002942234... some very large number]
Run Code Online (Sandbox Code Playgroud)

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

我可以在mongodb中创建一个集合,并将每个id作为文档插入,但它似乎有点矫枉过正,因为我想要的只是检查是否存在.

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

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

Pre*_*ids 5

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

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

class BlacklistedId
  include Mongoid::Document
  identity :type => Integer
end
Run Code Online (Sandbox Code Playgroud)

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

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

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