其實你可以不指定索引處的元素使用dot notation將你的文件。到兩個你有兩個選擇:
首先在MongoDB 3.2中使用$arrayElemAt
運算符new的最佳方式。它返回數組中指定索引處的元素。
db.collection.aggregate([
{ "$group": {
"_id": { "$arrayElemAt": [ "$arr", 0 ] },
"count": { "$sum": 1 }
}}
])
從MongoDB的3.0版本落後,你將需要由_id
然後去正常化您的陣列在第一時間$group
和使用$first
操作到陣列中返回的第一個項目。從那裏你將需要使用該值重新組合文檔,並使用$sum
來獲得總和。但是這隻適用於第一個和最後一個索引,因爲MongoDB還提供了$last
運算符。
db.collection.aggregate([
{ "$unwind": "$arr" },
{ "$group": {
"_id": "$_id",
"arr": { "$first": "$arr" }
}},
{ "$group": {
"_id": "$arr",
"count": { "$sum": 1 }
}}
])
其產生是這樣的:在p
位置
{ "_id" : "sad", "count" : 1 }
{ "_id" : "aga", "count" : 2 }
要使用元組數組中,你將使用mapReduce
功能得到更好的機會。
var mapFunction = function(){ emit(this.arr[0], 1); };
var reduceFunction = function(key, value) { return Array.sum(value); };
db.collection.mapReduce(mapFunction, reduceFunction, { "out": { "inline": 1 } })
將返回:
{
"results" : [
{
"_id" : "aga",
"value" : 2
},
{
"_id" : "sad",
"value" : 1
}
],
"timeMillis" : 27,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 1,
"output" : 2
},
"ok" : 1
}
感謝,我一直在尋找像'$ arrayElemAt'。我認爲這可能是更好的選擇,因爲我認爲在數組中添加第二個元素會更容易,通過這樣做......'{arr_0:{$ arrayElemAt:[$ arr,0]},arr_1:{$ arrayElemAt :[$ arr,1]},} – Daniel
@Daniel yes'$ arrayElemAt'絕對是最好的選擇。順便說一句,你應該考慮接受答案。 – styvane