我有以下post
文件:
post = {"_id": "postID1", "userID": "userID1", "likeNum": 10, "url": "anyUrl"}
我有一个疑问:
posts_collection.find({"userID": {"$nin": ["uid1", "uid2"]}, "_id": {"$nin": ["postID1", "postID2"]}}).sort("likeNum", DESCENDING).limit(30).explain()
我的聚合管道:
pipeline = [
{"$match":{"userID": {"$nin": ["uid1", "uid2"]}, "_id": {"$nin": ["postID1", "postID2"]}}},
{"$sort": {"likeNum": -1}},
{"$group": {"_id": "$userID", "posts": {"$firstN": {"input": "$$ROOT", "n": 2}}}},
{"$unwind": "$posts"},
{"$replaceWith": "$posts"},
{"$sort": {"likeNum": -1}},
{"$limit": 30}
]
posts_collection.aggregate(pipeline)
我已经建立了一个索引likeNum: -1
和另一个复合索引userID: 1, _id: 1, likeNum: -1
该explain()
方法始终显示它将进行likeNum: -1
并执行集合扫描。
并且我的聚合管道explained
输出也在我的 MongoDB Atlas 仪表板中的查询分析器中显示相同的信息。
是因为内存排序的性能$nin
不如集合扫描吗?还是其他原因?
注意:有时查询可能只有过滤器,userID
而没有过滤器_id
,也可能有相反的过滤器(_id
没有过滤器userID
),或者没有这些过滤器(在这种情况下,我理解为likeNum: -1
)。
如果这有助于理解这种行为,那么该集合中我有 10k 个文档。