2014-09-04 78 views
0

我有一個20個用戶的集合,其中19個沒有財產created_at這有一個稀疏的索引。
當我運行下面的則返回1號文件(一個與created_at屬性)取文件,沒有財產,我排序

db.users.find().sort({created_at: 1}) 

我如何排序上created_at也獲取所有對象無created_at財產蒙戈命令行

注意:這只是一個例子,真正的集合是更大的(而不是用戶),我們需要在該領域的稀疏索引

更新:我使用版本2.4.9(所以我需要升級它,並使用解決方案如下) http://docs.mongodb.org/manual/core/index-sparse/#sparse-index-incomplete-results

回答

2

這聽起來像你對「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」字段的文檔仍然會按照升序排列。在不修改數據的情況下,您需要類似聚合框架的投影來計算比預期日期值更大的值。

+0

我的問題並不真正代表真正的集合,但是你對稀疏索引是正確的,它需要在該字段上有稀疏索引 – 2014-09-04 10:04:16

+0

@SanderVisser是的,但它是產生此結果的稀疏索引。只要稀疏索引是「選定」索引,那麼**不可能**改變你現在的行爲。這就是我寫這個答案的原因,所以你可以理解這一點。 – 2014-09-04 10:06:53

+0

它可能從版本2.6(從文檔,在行爲)http://docs.mongodb.org/manual/core/index-sparse/我們有版本2.4.9所以我正在考慮升級 – 2014-09-04 10:17:28