2014-04-13 75 views
0

我有這樣集團/通過現場

{"foo" : "abc-123", more fields.... } 
{"foo" : "abc-456", more fields.... } 
{"foo" : "cde-000", more fields.... } 
{"foo" : "cde-555", more fields.... } 
{"foo" : "else-9991234", more fields.... } 

集合的一部分計數,想組和由foo第一部分數:

{ 
    "abc": 2, 
    "cde": 2, 
    "else": 1 
} 

我想過使用聚合框架爲此,但我不確定如何提取第一部分:

myColl.aggregate([ 
    $project: { firstPart: { ???? '$foo' 

回答

1

很遺憾,您需要像這樣拆分,否則您可能會在彙總管道中使用$ substr運算符。

但因爲你需要這個功能,你可以使用的MapReduce:

db.collection.mapReduce() { 
    function() { 
     var parts = this.foo.split("-"); 
     emit(parts[0], 1); 
    }, 
    function(key,values){ 
     return values.length; 
    }, 
    { "out": { "inline": 1 } } 
) 

任何發送到減速數組中統計的「價值觀」,任何與繞過減速只需一鍵,但我們已經返回計數爲1.

+0

謝謝,它可行! – georg

1

我不確定這是否可行與芒果。最後你必須在第一部分中分割出一個字符串和組。

如果我是你,我寧願修改你的模式以添加新字段foo1,這將是字符串的第一部分。你可以用foreach

db.collection.find().forEach(function(el){ 
    // here split your el['foo'] and update the el with new `foo1` which will have your first part 
}) 

之後,你可以輕鬆地使用聚合框架做到這一點。

+0

謝謝!你認爲可以使用map-reduce而不是AF嗎?添加一個新字段將會在我的工作流程中變得複雜... – georg