$ max运算符似乎不起作用

时间:2015-01-21 23:06:40

标签: mongodb mongodb-query

我有一个名为" 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)。

1 个答案:

答案 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 }

但实际上,请尝试使用$lte$gte运算符,而不是剪切索引边界。这也是避免逻辑混淆索引排序方向的可靠方法。