The answer lies in the query syntax:
Querying with find( { query:{ ...} } ) has to be written as find( { $query : {...} } ). But that does not work either.
Only with find( { <document> }).sort(...).limit(1) it works:
> db.pins.find({ poolid: 999, productid: 3868, state: "n",
validfrom : { "$lte" : ISODate("2012-09-22T10:47:13.961Z")} ,
validthru : { "$gt" : ISODate("2012-09-22T10:47:13.961Z")}
}).sort( { validthru: 1 } ).limit(1).explain()
{
"cursor" : "BtreeCursor poolid_1_productid_1_state_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 96191,
"nscanned" : 96191,
"nscannedObjectsAllPlans" : 577149,
"nscannedAllPlans" : 577149,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 2787,
"indexBounds" : {
"poolid" : [
[
888,
888
]
],
"productid" : [
[
3868,
3868
]
],
"state" : [
[
"n",
"n"
]
]
},
"server" : "cassi1:27017"
}
But the query takes very long due to the sort. The problem is, I need the sort to get the document that expires next. When now executing the query, I don't get the pin with the smallest 'validthru' value anyways:
rs1:PRIMARY> db.pins.find({ poolid: 999, productid: 3868, state: "n",
... validfrom : { "$lte" : ISODate("2012-09-22T10:47:13.961Z")} ,
... validthru : { "$gt" : ISODate("2012-09-22T10:47:13.961Z")}
... }).sort( { validthru: 1 } ).limit(1)
{ "_id" : ObjectId("505ae02a30c7d7555f2e3251"), "serial" : "5911058", "poolid" : 999, "productid" : 3868, "encpin" : "93FCFD8A66695F44CBF01D2D0F341FDB22B41F501C352F72", "validthru" : ISODate("2099-12-31T23:59:59Z"), "validfrom" : ISODate("2012-09-20T09:21:28.344Z"), "imported" : ISODate("2012-09-20T09:21:28.344Z"), "state" : "n" }
According to the data, there are pins that expire earlier:
> db.pins.group(
... { query: {poolid: 999, state: "n"},
... key: { productid: true, validthru : true, poolid: true, state : true },
... reduce: function(obj,prev) { prev.csum++ },
... initial: { csum: 0 }
... }
... )
[
{
"productid" : 3868,
"validthru" : ISODate("2099-12-31T23:59:59Z"),
"poolid" : 999,
"state" : "n",
"csum" : 170376
},
{
"productid" : 3868,
"validthru" : ISODate("2029-12-31T23:59:59Z"),
"poolid" : 999,
"state" : "n",
"csum" : 99900
}
]