我有一个名为" snapshots"它的索引定义如下:
{ systemSnapshotsId: 1, dataType: 1, startFrame: -1 }
我试图使用$ max运算符创建一个查询来为查询定义该索引的上限,但它似乎没有效果。
如果我在不使用max的情况下执行以下查询,则会获得469461个文档的计数。
db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).count()
当我添加max()运算符时,使用以下查询,我得到了469461个文档的数量。
db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).max({systemSnapshotsId: <sameId>, dataType: "blah", startFrame: 500}).count()
如果我有倒退的话,我希望第二次查询的数量为500,甚至计数为468961(总数减去500)。
答案 0 :(得分:0)
那是因为你通过定义索引的方式向后反转。快速举例说明。假设你有这个系列:
{ "_id" : ObjectId("54c035bd2f63310180151870"), "a" : 1, "b" : 2, "c" : 1 }
{ "_id" : ObjectId("54c035c92f63310180151871"), "a" : 1, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("54c035cc2f63310180151872"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("54c035cf2f63310180151873"), "a" : 1, "b" : 2, "c" : 4 }
{ "_id" : ObjectId("54c035d32f63310180151874"), "a" : 1, "b" : 2, "c" : 5 }
然后定义索引:
db.minmax.ensureIndex({ "a": 1, "b": 1, "c": -1 })
然后运行此查询,结果为:
db.minmax.find({ "a": 1, "b": 2, "c": { "$lte": 3 } })
{ "_id" : ObjectId("54c035cc2f63310180151872"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("54c035c92f63310180151871"), "a" : 1, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("54c035bd2f63310180151870"), "a" : 1, "b" : 2, "c" : 1 }
然后尝试使用$max
修饰符:
db.minmax.find({ "a": 1, "b": 2 }).max({ "a": 1, "b": 2, "c": 3 })
{ "_id" : ObjectId("54c035d32f63310180151874"), "a" : 1, "b" : 2, "c" : 5 }
{ "_id" : ObjectId("54c035cf2f63310180151873"), "a" : 1, "b" : 2, "c" : 4 }
相反,因为您的索引在第一个位置以“c”的“最高”值排序。所以你想要的是“反向”,即$min
:
db.minmax.find({ "a": 1, "b": 2 }).min({ "a": 1, "b": 2, "c": 3 })
{ "_id" : ObjectId("54c035cc2f63310180151872"), "a" : 1, "b" : 2, "c" : 3 }
{ "_id" : ObjectId("54c035c92f63310180151871"), "a" : 1, "b" : 2, "c" : 2 }
{ "_id" : ObjectId("54c035bd2f63310180151870"), "a" : 1, "b" : 2, "c" : 1 }