pymongo巨大的收藏清单

时间:2019-06-27 02:17:32

标签: mongodb pymongo

您知道mongodb中没有联接,所以我像这样执行喜欢联接查询。

users = user_collection.find({"region": "US", `and some condition here`}, projection={"user_id": 1"})
user_list = [
    user['user_id']
    for user in users
]
posts = post_collection.find({"user_id": {"$in": user_list}, `and some condition here`)

(为避免带来不必要的字段,在projection中也使用了find()选项)

集合和列表大小

用户= 2000000

user_list = 100000

帖子= 2000000

执行查询时,大约需要4秒钟。

其中,使user_list花费将近3秒钟。

问题

  1. 如何有效地列出仅包含user_id的结果?
  2. 有什么方法可以改善此处的效果?

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,请确保您查询的字段已正确索引。如果已经完成,您可以尝试以下方法:

1。使用distinct()

您可以使用distinct在一个查询中获取user_list

类似这样:

user_list = user_collection.distinct("user_id", {"region": "US", ...})

2。使用$ lookup进行聚合

第二个选项是通过执行user_collection中的$lookup来检索单个查询中的帖子:

user_collection.aggregate([
  {
    "$match": {"region": "US", ...}
  }, 
  {
    "$lookup": {
        "from": "post_collection",
        "localField": "user_id",
        "foreignField": "user_id",
        "as": "post"
    }
  }, 
  ...
])

,然后使用$unwind$match阶段过滤帖子