2011-06-09 100 views
2

我需要将一个无序的ID列表存储在mongo中作为“黑名单”,并纯粹用它来检查原因。使用Mongodb来存储一个非常大的“黑名单”ID列表

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

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

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

什么是正确的方法来做到这一点?

注意:我正在使用mongoid/rails。 =)

回答

5

这些ID是否是整数?在1.8版中,Mongo的文档大小限制被提高到了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. 

通过告诉蒙戈,你只想要_id外地回来,它会为你的查询直出_id指数并不会刻意去寻找磁盘上的实际文件。这将使事情保持活跃,并且也意味着Mongo不需要将实际的集合保存在RAM中 - 只是索引中的值。

+0

谢谢!多好的答案。为了以防万一,我想我会和黑名单集合在一起。这也将释放服务器端的内存,因为加载16M文档也可能会减慢速度。 我很担心查询速度,但看起来像你有一个伟大的观点w优化 – 2011-06-09 07:33:16

相关问题