2015-10-28 72 views
5

我開始學習MongoDB中,我使用文檔這樣的:如何使用MongoDB對數組的第一個元素進行分組?

{ 
    "_id" : ObjectId("562fac8a4f9ecec40f5b8ff9"), 
    "foo" : { 
     "objectid" : "39", 
     "stuff" : "65" 
    }, 
    "yearpublished" : [ 
     "1979" 
    ], 
    "bar": "1263" 
} 

yearpublished是一個數組,我想組我收藏的這個數組的第一個值,然後計算的相關文件量。

我已經做了這個查詢:

db.foobar.aggregate(
    [ 
     { 
     $group : { 
      _id : '$yearpublished', 
      count: { $sum: 1 } 
     } 
     } 
    ] 
) 

,並得到:

{ 
    "result" : [ 
     { 
      "_id" : [ 
       "1923" 
      ], 
      "count" : 1.0000000000000000 
     }, 
     { 
      "_id" : [ 
       "1864" 
      ], 
      "count" : 1.0000000000000000 
     } 
} 

但是我正在尋找這種結果(即第一個元素只):

{ 
    "result" : [ 
     { 
      "_id" : "1923, 
      "count" : 1.0000000000000000 
     }, 
     { 
      "_id" : "1864", 
      "count" : 1.0000000000000000 
     } 
} 

我試過_id : { $first: '$yearpublished.0' },_id : { $first: '$yearpublished[0]' },沒有成功。

你知道嗎我可以按數組的第一個元素分組一年發佈

回答

7

不幸的是,現在唯一的方法是在處理$unwind後從數組中提取$first元素。然後,當然,你將不得不再次$group

db.foobar.aggregate([ 
    { "$unwind": "$yearpublished" }, 
    { "$group": { 
     "_id": "$_id", 
     "yearpublished": { "$first": "$yearpublished" } 
    }}, 
    { "$group": { 
     "_id": "$yearpublished", 
     "count": { "$sum": 1 } 
    }} 
]) 

這就是目前唯一的方式來獲得一個數組中的「第一」元素,通過解構,並通過操作來獲取項目。

未來版本將有$arrayElemAt可以通過指數單一階段內做到這一點:

db.foobar.aggregate([ 
    { "$group": { 
     "_id": { "$arrayElemAt": [ "$yearpublished", 0 ] }, 
     "count": { "$sum": 1 } 
    }} 
]) 

但目前的聚合框架不隨「點號」索引的使用,如標準的「投影」與.find()處理這樣做,並且不會,因此新的操作。

+0

非常感謝這個完整的答案。 – Alex

相關問題