2013-02-15 32 views
6

讓說我有以下的集合:查找最高從文件子陣列值

{ _id: 1, Array: [ 
    { K: "A", V: 8 }, 
    { K: "B", V: 5 }, 
    { K: "C", V: 13 } ] } 

{ _id: 2, Array: [ 
    { K: "D", V: 12 }, 
    { K: "E", V: 14 }, 
    { K: "F", V: 2 } ] } 

我想運行一個返回子文檔具有最高的「V」的查詢,所以在情況下,我會得到:

{ _id: 1, Array: [ { K: "E", V: 14 } ] } 

或者乾脆:

{ K: "E", V: 14 } 

最重要的部分是,我想在旺內存使用情況o服務器是O(1)(無論我處理的文檔數量多少,內存使用率是不變的),我只想用我需要的值檢索一個子文檔(我不想下載比必要的更多的子文檔)。

我的首選方法是使用簡單的查找查詢,但我不確定這是否可能。我懷疑這也可以通過聚合框架(或縮小地圖?)來完成,但是看不到。我不希望結果存儲在臨時集合中,而是直接返回給我的客戶端(如正常查詢)。

+0

你不能用一個查找做到這一點,但你應該能夠與聚合框架。 – JohnnyHK 2013-02-15 15:26:03

+0

我被困在如何將數組中的所有項摺疊成單個子文檔。 – Flavien 2013-02-15 15:30:48

+0

看看['$ unwind'](http://docs.mongodb.org/manual/reference/aggregation/unwind/#_S_unwind)。 – JohnnyHK 2013-02-15 15:33:55

回答

5

下面的aggratation集返回你所需要的。

db.letters.aggregate([ 
    {$project:{"Array.K":1, "Array.V":1}}, 
    {$unwind:"$Array"}, 
    {$sort:{"Array.V":-1}}, 
    {$limit:1} 
]); 

返回:

{"_id":2, "Array":{"K":"E","V":14}} 

享受! :)

2

正如@JohnnyHK說:

db.col.aggregate([ 
    {$unwind: '$Array'}, 
    {$group: {_id: '$_id', Array: {K: {$max: '$K'}, V: {$max: '$V'}}}} 
]) 

類似的東西。

0

簡單的話, 如果你有蒙戈查詢響應像下面的東西 - ,你想從陣列 - > 「Wish_CreatedDate」

{ 
    "_id": "57ee5a708e117c754915a2a2", 
    "TotalWishs": 3, 
    "Events": [ 
    "57f805c866bf62f12edb8024" 
    ], 
    "wish": [ 
    "Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)", 
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)", 
    "Suunto Digital Black Dial Unisex Watch - SS018734000" 
    ], 
    "Wish_CreatedDate": [ 
    "2017-03-05T00:00:00.000Z", 
    "2017-02-13T00:00:00.000Z" 
    ], 
    "UserDetails": [ 
    { 
     "createdAt": "2016-09-30T12:28:32.773Z", 
     "jeenesFriends": [ 
     "57edf8a96ad8f6ff453a384a", 
     "57ee516c8e117c754915a26b", 
     "58a1644b6c91d2af783770b0", 
     "57ef4631b97d81824cf54795" 
     ], 
     "userImage": "user_profile/Male.png", 
     "email": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 

}, 

只有最高值** *然後,你必須添加

Latest_Wish_CreatedDate:{$最大: 「$ Wish_CreatedDate」},

財產以後像如下─

{ 
       $project : { _id: 1, 
          TotalWishs : 1 , 
           wish:1 , 
           Events:1, 
           Wish_CreatedDate:1, 
           Latest_Wish_CreatedDate: { $max: "$Wish_CreatedDate"}, 
          } 
      } 

和最終查詢響應將低於

{ 
    "_id": "57ee5a708e117c754915a2a2", 
    "TotalWishs": 3, 
    "Events": [ 
    "57f805c866bf62f12edb8024" 
    ], 
    "wish": [ 
    "Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)", 
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)", 
    "Suunto Digital Black Dial Unisex Watch - SS018734000" 
    ], 
    "Wish_CreatedDate": [ 
    "2017-03-05T00:00:00.000Z", 
    "2017-02-13T00:00:00.000Z" 
    ], 
    "UserDetails": [ 
    { 
     "createdAt": "2016-09-30T12:28:32.773Z", 
     "jeenesFriends": [ 
     "57edf8a96ad8f6ff453a384a", 
     "57ee516c8e117c754915a26b", 
     "58a1644b6c91d2af783770b0", 
     "57ef4631b97d81824cf54795" 
     ], 
     "userImage": "user_profile/Male.png", 
     "email": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 
    "Latest_Wish_CreatedDate": "2017-03-05T00:00:00.000Z" 
},