【问题标题】:Using Mongodb to store a very large list of "blacklist" ids使用 Mongodb 存储非常大的“黑名单”ID 列表
【发布时间】:2011-06-09 04:37:46
【问题描述】:

我需要在 mongo 中存储一个无序列表的 ID 作为“黑名单”,并纯粹出于检查原因使用它们。

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

但是将其存储在单个文档中是不可行的,因为我会很快突破 2Mb 的限制。

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

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

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

【问题讨论】:

    标签: ruby mongodb mongoid


    【解决方案1】:

    这些 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 中 - 只需将值保存在索引中。

    【讨论】:

    • 谢谢!多么棒的答案。我想我会选择列入黑名单的收藏,以防万一。这也将释放服务器前端的内存,因为加载 16M 的文档也会减慢速度。我担心查询速度,但看起来你的优化很重要
    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多