2016-04-24 51 views
0

場的最大如何獲得最大sections.Id以下文件,其中collection._id =一些參數MongoDB的查詢來獲取裏面陣列

{ 
    "_id" : ObjectId("571c5c87faf473f40fd0317c"), 
    "name" : "test 1", 
    "sections" : [ 
     { 
      "Id" : 1, 
      "name" : "first section" 
     }, 
     { 
      "Id" : 2, 
      "name" : "section 2" 
     }, 
     { 
      "Id" : 3, 
      "name" : "section 3" 
     } 
} 

我曾嘗試下面

db.collection.aggregate(
[ 
    { 
     "$match": { 
      "_id": ObjectId("571c5c87faf473f40fd0317c") 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$_id", 
      "maxSectionId" : {"$max" : "$sections.Id"} 
     } 
    } 
]); 

但在不是返回max int single值,而是返回section數組中所有id的數組。

在node.js中執行更多相同的查詢時,它將返回一個空數組。

回答

1

您的聚集查詢需要$unwind爲opennig到"sections"陣列

添加聚集查詢此

{$unwind : "$sections"} 

和你的重構聚集這樣的查詢

db.collection.aggregate(
[ 
    {$unwind : "$sections"}, 
    { 
     "$match": { 
      "_id": ObjectId("571c5c87faf473f40fd0317c") 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$_id", 
      "maxSectionId" : {"$max" : "$sections.Id"} 
     } 
    } 
]); 

$unwind更多的知識:https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/

0

替換$組$項目

In the $group stage, if the expression resolves to an array, $max does not traverse the array and compares the array as a whole.

With a single expression as its operand, if the expression resolves to an array, $max traverses into the array to operate on the numerical elements of the array to return a single value [sic]

+0

使用$項目拋出異常:無效運算符「$最大」,代碼15999 –

+0

什麼版本的MongoDB是您使用......在這種情況下,請按照@kakashi hatake的說明使用展開,但在匹配查詢後使用它來限制展開文檔的數量 – kryshna

+0

MongoDB shell版本:3.0.7。我需要所有展開的部分的最大值,但是對於已經應用了過濾器的特定collection._id,因此無法對sections.Id應用過濾器。 –