2013-10-14 52 views
3

說我有一個文件的集合,它是這樣的:排序匹配的子文檔

{ 
    "_id": ObjectId("507f191e810c19729de860ea"), 
    "users": [{ 
     "userId": ObjectId("507f1f77bcf86cd799439011"), 
     "deleted": false, 
     "updatedAt" ISODate("2013-10-17T20:46:22Z") 
    }, { 
     "userId": ObjectId("507f1f71baf40ea8438490fa"), 
     "deleted": false, 
     "updatedAt" ISODate("2013-10-17T22:19:10Z") 
    }] 
} 

現在,假設我查詢具有包含特定的用戶id,一個「用戶」子文檔一份文件,其中ISN 「T刪除 - 所以,一個查詢看起來像:

{"users.userId": ObjectId("507f1f77bcf86cd799439011"), "users.deleted": false} 

有沒有可能到再排序行中的匹配子文檔的屬性updatedAt返回結果集?如果沒有,是否有更適當的方法來設置?我是否應該創建另一個我現在嵌入users密鑰的集合,然後讓它引用父文檔?

回答

1

是的,這是可能的。你可以試試這個:

db.collection.aggregate([ 
{$unwind:"$users"}, 
{$match:{"users.userId":"ObjectId("507f1f77bcf86cd799439011")","users.deleted":false}}, 
{$sort:{"users.updatedAt":1}}]) 

這裏的'收藏'將被你的收藏的名字取代。

+0

如果我有一個索引定義爲:'{「users.userId」:1,「users.deleted」:1,「users.updatedAt」:-1}',那麼索引是否覆蓋了這個查詢?這將是通常運行的,所以如果出於性能原因將它帶入單獨的集合更有意義 - 我寧願這樣做。 –

+0

@ColinMorelli是的,這仍然有效。 – Jhanvi

+0

@ColinMorelli,但你仍然可以測試它,當然。 – Jhanvi