2016-08-12 84 views
2

我正在收集數組an_array和字段a_field。數組可以是由數值組成(數組可能爲空),它也可以存在於a_field中。MongoDB集合中的字段和數組的總和

我想要創建一個彙總函數,它將a_fieldan_array中的值的數量相加。

編輯:例如我想要計算在a_fieldan_array等中使用1多少次。

例如,如果我有一些文件,看起來像這樣:

{ 
    a_field: 1, 
    an_array: [ 1, 3, 4 ], 
}, 
{ 
    a_field: 3, 
    an_array: [], 
} 
{ 
    a_field: 2, 
    an_array: [ 1 ], 
} 

我想看到像這樣的輸出:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 2, a_count: 1, b_count: 0 }, { _id: 3, a_count: 1, b_count: 1 }, { _id: 4, a_count: 0, b_count: 1 } ] 

但是我得到的輸出是這樣的:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 3, a_count: 1, b_count: 1 }, { _id:4, a_count: 1, b_count: 1 } ] 

這是不正確的,因爲它缺少_id 2,和_id 4有太多的數字。

然而,我面臨的問題是,當an_array爲空時,如果數組爲空,我將無法正確檢索所有計數,並且它會得到a_count的值,該值不總是與實際的id匹配(如可在_id 4中看到的)。

我到目前爲止是這樣的:

db.getCollection('test').aggregate([ 
    { $match: { 
     a_field: { 
      $ne: null 
     } 
    } }, 

    { $group: { 
     _id: '$a_field', 
     a_count: { 
      $sum: 1 
     }, 
     an_array: { 
      $push: { 
       an_array: '$an_array' 
      } 
     } 
    } }, 

    { $project: { 
     an_array: 1, 
     a_count: 1 
    } }, 

    { $unwind: '$an_array' }, 
    { $unwind: '$an_array.an_array' }, 

    { $group: { 
     _id: '$an_array.an_array', 
     b_count: { 
      $sum: 1 
     }, 
     a_count: { 
      $first: '$a_count' 
     } 
    } }, 
]); 

我真的很感激一些投入,因爲我喜歡做在一個單一的聚合。在這一點上,這已經變成了比實際實施更個人化的任務。謝謝!

編輯:我現在綁定到MongoDB 2.6。

+0

爲什麼使用需要應用'$ sum'爲'a_field'如果不是一個數組?在預期的輸出中是什麼'_id'? – styvane

+0

輸出中的_id是當前的'an_array'值之一。這也是我所期望的,我得到一個數字的清單,並有一筆數額。你是什​​麼意思爲什麼我們需要申請'$ sum'?如果我想繼續指望它被添加的次數,那是唯一的方法,不是嗎? –

+0

其實,你已經向我們展示了3個文檔,並且在你的預期輸出中你有4個。另外,如果你想要的是'an_array'字段中的不同項目,而不等於'a_field',那麼你做錯了。即使不明顯,也有更好的方法來做到這一點。你應該考慮改善你的問題。 – styvane

回答

1

使用$size爲陣列領域,這是新的v2.6你幸運的男孩!

此外,我不明白你爲什麼會想嘗試和計數$a_field - 總是有將是一個因素,因爲它不是一個陣列 - 所以此聚集只包括什麼$a_field是作爲結果_id。你知道,$a_field計數將永遠是1,因爲它不是一個數組:

db.test.aggregate([{ 
    $match: { 
    a_field: { 
     $ne: null 
    } 
    } 
}, { 
$group: { 
    _id: '$a_field', 
    an_array_size: { 
     $size: '$an_array' 
    } 
    } 
}]) 

實例控制檯輸出:

> db.test.find({}); 
{ 
    "_id": ObjectId("57ada868700ca97222421d8b"), 
    "a_field": 1, 
    "an_array": [1, 3, 4] 
} 

> db.test.aggregate([{ 
    $match: { 
    a_field: { 
     $ne: null 
    } 
    } 
}, { 
$group: { 
    _id: '$a_field', 
    an_array_size: { 
     $size: '$an_array' 
    } 
    } 
}]) 
{ 
    "result": [{ 
    "_id": 1, 
    "an_array_size": 3 
    }], 
    "ok": 1 
} 
+0

我喜歡你的評論,但這不是我要求的。如果它很模糊,那麼對不起,我會修改我的問題。我之所以用'sum'是因爲我想知道'a_field'和'an_array'中_many_次'1','2等的使用情況。這更清楚嗎? –

+0

看看我給出的例子輸出。 –

+0

啊更清晰了!我會更新答案,我沒有看到_id :, 4的例子。 –