這聽起來像你對「created_at」領域,這是您看到此行爲的唯一原因定義的"sparse index"。
應持以下資料爲樣本:
{ "_id" : ObjectId("54082229b70a1512aacb5e7e"), "x" : 1, "y" : 1 }
{ "_id" : ObjectId("5408222fb70a1512aacb5e7f"), "x" : 2 }
{ "_id" : ObjectId("54082231b70a1512aacb5e80"), "x" : 3 }
如果你只是想「排序」的「Y」在這裏你應該得到這樣的結果:
> db.test.find().sort({ y: 1 })
{ "_id" : ObjectId("5408222fb70a1512aacb5e7f"), "x" : 2 }
{ "_id" : ObjectId("54082231b70a1512aacb5e80"), "x" : 3 }
{ "_id" : ObjectId("54082229b70a1512aacb5e7e"), "x" : 1, "y" : 1 }
但是,如果你加稀疏索引:
db.test.ensureIndex({ y: 1 },{ sparse: true })
那麼結果是不同的,但對小數據,我們需要給力指數:
> db.test.find().hint({ y: 1 }).sort({ y: 1 })
{ "_id" : ObjectId("54082229b70a1512aacb5e7e"), "x" : 1, "y" : 1 }
這就是這種情況的唯一情況下,默認的是,非本領域將被視爲null
和「小於」所存在的其它值。
因此,如果指數變化:
db.test.dropIndexes()
db.test.ensureIndex({ y: 1 })
而且問題一樣statment,其結果將是原來一樣:
> db.test.find().hint({ y: 1 }).sort({ y: 1 })
{ "_id" : ObjectId("5408222fb70a1512aacb5e7f"), "x" : 2 }
{ "_id" : ObjectId("54082231b70a1512aacb5e80"), "x" : 3 }
{ "_id" : ObjectId("54082229b70a1512aacb5e7e"), "x" : 1, "y" : 1 }
所以這是稀疏索引如何影響結果在這裏排除索引字段不存在的文檔。
您可以用下面的檢查:
> db.test.getIndexes()
{
"v" : 1,
"key" : {
"y" : 1
},
"name" : "y_1",
"ns" : "test.test",
"sparse" : true
}
如果這是你的ODM設置被自動創建的,那麼你可能需要看看「手動」指定索引的條件來使用。
注意:即使在索引固定的情況下,沒有「created_at」字段的文檔仍然會按照升序排列。在不修改數據的情況下,您需要類似聚合框架的投影來計算比預期日期值更大的值。
我的問題並不真正代表真正的集合,但是你對稀疏索引是正確的,它需要在該字段上有稀疏索引 – 2014-09-04 10:04:16
@SanderVisser是的,但它是產生此結果的稀疏索引。只要稀疏索引是「選定」索引,那麼**不可能**改變你現在的行爲。這就是我寫這個答案的原因,所以你可以理解這一點。 – 2014-09-04 10:06:53
它可能從版本2.6(從文檔,在行爲)http://docs.mongodb.org/manual/core/index-sparse/我們有版本2.4.9所以我正在考慮升級 – 2014-09-04 10:17:28