1

我的文件看起來是這樣的:MongoDB的平均嵌入式陣列作爲額外的字段

{ 
    "_id" : "53ce85eda2579da8b40c1f0f", 
    "name" : "Autokino", 
    "tags" : [ 
     "forMen" 
    ], 
    "ratings" : [ 
     { "rating" : 5, "uuid" : "..."}, 
     { "rating" : 4, "uuid" : "..."}, 
     { "rating" : 4, "uuid" : "..."}, 
     { "rating" : 1, "uuid" : "..."}, 
    ] 
} 

現在我需要ratings.rating的平均值(這裏應該是3.5)。我的查詢是這樣的:

activities.aggregate([ 
    { $match: { _id: ObjectID(req.params.id) } }, 
    { $unwind: '$ratings' },                                           
    { $group: { 
     _id: '$_id', 
     rating: { $avg: '$ratings.rating'}, 
    }}, 
]); 

它的工作原理,但我得到的是:

{ 
    "_id" : "53ce85eda2579da8b40c1f0f", 
    "rating" : 3.5 
} 

,這就是我需要得到:

{ 
    "_id" : "53ce85eda2579da8b40c1f0f", 
    "name" : "Autokino", 
    "tags" : [ 
     "forMen" 
    ], 
    "rating" : 3.5 
} 

(原始文檔而不評級陣列但隨着等級的平均)

我怎樣才能解決這個問題?

回答

3

$group$project流水線級的是,只有在聲明的字段都發出「絕對」。這裏需要另一個操作員。 $first會做:

activities.aggregate([ 
    { "$match": { "_id": ObjectID(req.params.id) } }, 
    { "$unwind": "$ratings" },                                           
    { "$group": { 
     "_id": "$_id", 
     "name": { "$first": "$name" }, 
     "tags": { "$first": "$tags" }, 
     "rating": { "$avg": "$ratings.rating" }, 
    }}, 
]); 

由於$unwind使得許多文件出的數組內容去規範化,您可以使用$first這裏只取你是不是另有聚集更多的領域的「第一」的發生。

如果你擔心許多領域的申報這樣的MongoDB 2.6確實提供了$$ROOT變量。 I'ts用法和輸出可能不是你真正想要的:

activities.aggregate([ 
    { "$match": { "_id": ObjectID(req.params.id) } }, 
    { "$project": { 
     "_id": "$$ROOT", 
     "ratings": 1 
    }}, 
    { "$unwind": "$ratings" },                                           
    { "$group": { 
     "_id": "$_id", 
     "rating": { "$avg": "$ratings.rating" }, 
    }}, 
]); 

這給了你這樣的:

{ 
    "_id" : { 
     "_id": "53ce85eda2579da8b40c1f0f", 
     "name" : "Autokino", 
     "tags" : [ 
      "forMen" 
     ], 
     "ratings" : [ 
      { "rating" : 5, "uuid" : "..."}, 
      { "rating" : 4, "uuid" : "..."}, 
      { "rating" : 4, "uuid" : "..."}, 
      { "rating" : 1, "uuid" : "..."}, 
     ] 
    }, 
    "rating": 3.5 
} 

這是正常的,因爲在這裏通過_id分組相同總體上分組文件。所以你總是可以添加最後的$project以回到類似的狀態。但是這裏沒有通配符。

+0

我的文檔大,有許多領域,是有什麼事,可以讓我訪問洞文件? – dkoch

+0

@dkoch在MongoDB中2.6存在$$ ROOT'變量,但將只分配給一個域,即使它是所有的文件在當前流水線階段。你仍然需要一個最終的'$ project'來獲得原始結構。無論如何,MongoDB查詢都是數據結構。實際上應該生成它們而不是硬編碼它們。 –

+0

開卷不起作用,因爲$評級不會在第二個上市的投影 – dkoch

0

我只是通過這個整首歌曲和舞蹈也去了,最終有我所有的領域重新加回。不理想!

所以我剛剛發現這一點 - 要容易得多:我有一個評論陣列場,其中有1級住宅 - 5

{ 
     $addFields: { avg: { $avg: '$reviews.rating'}} 
},