Mongodb $max操作员似乎不工作

Mongodb $max操作员似乎不工作,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个名为“快照”的集合,其索引定义如下: { systemSnapshotsId: 1, dataType: 1, startFrame: -1 } 我试图使用$max操作符创建一个查询,为查询定义该索引的上限,但似乎没有效果 如果我在不使用max的情况下执行以下查询,我将获得469461个文档的计数 db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).count() db.snapshots

我有一个名为“快照”的集合,其索引定义如下:

{ systemSnapshotsId: 1, dataType: 1, startFrame: -1 }
我试图使用$max操作符创建一个查询,为查询定义该索引的上限,但似乎没有效果

如果我在不使用max的情况下执行以下查询,我将获得469461个文档的计数

db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).count()
db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).max({systemSnapshotsId: <sameId>, dataType: "blah", startFrame: 500}).count()
当我使用下面的查询添加max()操作符时,我得到了469461个文档

db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).count()
db.snapshots.find({systemSnapshotsId: ObjectId("---"), dataType: "blah"}).max({systemSnapshotsId: <sameId>, dataType: "blah", startFrame: 500}).count()
db.snapshots.find({systemSnapshotsId:ObjectId(“--”),数据类型:“blah”}).max({systemSnapshotsId:,数据类型:“blah”,startFrame:500}).count()

我希望第二次查询的计数为500,或者如果我向后查询,则计数为468961(总计数减去500)。

这是因为按照定义索引的方式,确实是向后查询的。快速的例子来解释。假设您拥有此集合:

{u 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}
{u 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}
{u id:ObjectId(“54c035bd2f63310180151870”),“a”:1,“b”:2,“c”:1}
然后尝试使用修改器:

db.minmax.find({a:1,b:2}).max({a:1,b:2,c:3})
{u id:ObjectId(“54c035d32f63310180151874”),“a”:1,“b”:2,“c”:5}
{“_id”:ObjectId(“54c035cf2f63310180151873”),“a”:1,“b”:2,“c”:4}
它是相反的,因为您的索引是以“最高”值“c”在第一个位置排序的。因此,您需要的是“反向”,即:

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}
{u id:ObjectId(“54c035bd2f63310180151870”),“a”:1,“b”:2,“c”:1}

但实际上,在裁剪索引边界之前,请尝试适当地使用or运算符。这也是避免索引按哪个方向排序的逻辑混乱的可靠方法。

提供的答案是否有您不理解的地方或需要更多澄清的地方?这就是索引剪辑的工作原理,所以这就是解释的重点。谢谢你的反馈。你是对的,我把“min”和“max”的值颠倒了,因为我的索引使用的是降序键。但是,看起来count()操作符只对传递给find()的查询返回的项目进行计数,而忽略传递给min或max的任何内容。谢谢!