gpt4 book ai didi

mongodb - 删除 "scanAndOrder": true in my MongoDB query result

转载 作者:IT老高 更新时间:2023-10-28 13:33:29 25 4
gpt4 key购买 nike

所以我在我的数据库中有一个包含以下 shardkey 的集合:{cl:"yyyy-mm", user_id:N}

当我执行后续查询时

db.collection.find({ cl:"2012-03", user_id:{$in:users}, _id:{"$lt":new ObjectId('4f788b54204cfa4946000044')} }).sort({_id:-1}).limit(5).explain(true)

它给了我这个结果:

"clusteredType" : "ParallelSort",
"shards" : {
"set1/hostname.com:27018" : [
{
"cursor" : "BtreeCursor cl_1_user_id_1 multi",
"nscanned" : 21294,
"nscannedObjects" : 21288,
"n" : 5,
"scanAndOrder" : true,
"millis" : 1258,
"nYields" : 69,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : { ...

那么如何进行排序以使用索引然后我不需要扫描所有 21288 个文档,只需返回最后 5 个?

最佳答案

感谢您对 Dex 的大力支持!

如果在 2013 年还不算太晚,我推荐的避免 scanAndOrder 的索引是 { _id: -1, cl: 1, user_id: 1 }。

原因是因为 _id 上的 $lt 和 user_id 上的 $in 构成了跨多个索引“桶”的范围。除上述顺序之外的任何其他顺序的索引意味着这些存储桶仍必须一起排序以满足对 _id 的排序。通过将_id放在首位,索引中访问的所有文档都会提前正确排序。

请注意,这比 Andre 的建议({ _id: -1, user_id: 1, cl: 1 },这也应该避免 scanAndOrder)略有改进,因为它允许对 cl 进行直接等效检查以修剪结果。

查看 http://blog.mongolab.com/2012/06/cardinal-ins/了解更多详情。

关于mongodb - 删除 "scanAndOrder": true in my MongoDB query result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com