【问题标题】:query too large issue with mongodbmongodb查询太大问题
【发布时间】:2016-01-29 18:20:48
【问题描述】:

假设我们有一个用户集合,每个用户后面跟着另一个用户。如果我想找到不关注我的用户,我需要执行以下操作:

db.users.find({_id: { $nin : follower_ids } } ) ;

如果followers_ids的数量很大,比如说10万用户,mongodb会开始说查询太大,加上通过网络发送大量数据进行查询也不好。在不通过网络发送所有这些 id 的情况下完成此查询的最佳实践是什么?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    我建议您限制查询结果的数量以减少网络需求。根据Docs

    MongoDB 游标以多个文档组的形式返回结果。如果你知道你想要的结果的数量,你可以通过发出limit()方法来减少对网络资源的需求。

    这通常与排序操作结合使用。为了 例如,如果您只需要向用户查询 50 个结果 收集,您将发出以下命令:

    db.users.find({$nin : followers_ids}).sort( { timestamp : -1 } ).limit(50)
    

    然后您可以根据需要使用光标检索更多用户文档。

    建议重组追随者架构

    如果关注者会增长到大量,我建议您重新构建用户文档。当前用户架构可能是这样的:

    {
        _id: ObjectId("123"),
        username: "jobs",
        email: "stevej@apple.com",
        followers: [
            ObjectId("12345"),
            ObjectId("12375"),
            ObjectId("12395"),
        ]
    }
    

    架构的好处在于,每当此用户执行任何操作时,您需要通知的所有用户都在文档内部。不利的一面是,如果您需要找到用户关注的每个人,您将不得不查询整个用户集合。此外,随着关注者的增长,您的用户文档将变得更大、更不稳定。

    您可能希望进一步规范您的关注者。您可以保留一个将被关注者与关注者匹配的集合,其文档如下所示:

    {
        _id: ObjectId("123"),//Followee's "_id"
        followers: [
            ObjectId("12345"),
            ObjectId("12375"),
            ObjectId("12395"),
        ]
    }
    

    这将使您的用户文档保持纤细,但需要额外的查询才能获得关注者。随着“追随者”数组大小的变化,您可以启用userPowerOf2Sizes 分配策略来减少碎片和移动。

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      相关资源
      最近更新 更多