提问者:小点点

使用mongoDB查询过大问题


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

db. user.find({_id:{$nin:followers_ids } } ) ;

如果followers_ids量很大,比如说100k用户,mongoDB会开始说查询太大,再加上通过网络发送大量数据以使查询也不好。


共1个答案

匿名用户

我建议你限制查询结果的数量以减少网络需求。根据文档,

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

这通常与排序操作结合使用。例如,如果您只需要从查询到用户集合的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"),
    ]
}

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