假设我们有一组用户,每个用户都跟着另一个用户。如果我想找到不关注我的用户,我需要做类似的事情:
db.users.find({_ id:{$ nin:followers_ids}});
如果followers_ids的数量巨大,让我们说100k用户,mongodb会开始说查询太大,再加上通过网络发送大量数据,使得查询也不好。在没有通过网络发送所有这些ID的情况下,完成此查询的最佳做法是什么?
答案 0 :(得分:1)
我建议您限制查询结果的数量以减少网络需求。根据{{3}},
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"),
]
}
关于模式的好处是,无论何时此用户执行任何操作,您需要通知的所有用户都在文档内部。缺点是如果您需要找到用户关注的每个人,您将不得不查询整个用户集合。随着粉丝的增长,您的用户文档也会变得更大,更不稳定。
您可能希望进一步规范您的粉丝。您可以将与followee匹配的集合与跟随者保持如下文档:
{
_id: ObjectId("123"),//Followee's "_id"
followers: [
ObjectId("12345"),
ObjectId("12375"),
ObjectId("12395"),
]
}
这将使您的用户文档保持苗条,但需要额外的查询才能获得关注者。作为"粉丝"数组更改大小,您可以启用Docs分配策略以减少碎片和移动。