使用group()进行mongodb查询?

时间:2012-12-18 09:05:19

标签: mongodb

这是我的收藏结构:

coll{
id:...,   
fieldA:{
   fieldA1:[
       {
           ...
       }
   ], 
   fieldA2:[
       {
           text: "ciao",
       },
       {
           text: "hello",
       },   
   ] 
} 
}

我想提取我的收藏集中的所有fieldA2,但如果fieldA2位于two or more times我希望仅展示one

我试试这个

Db.runCommand({distinct:’coll’,key:’fieldA.fieldA2.text’}) 

但没有。这将返回集合中的所有filedA1

所以我试试

db.coll.group( {

               key: { 'fieldA.fieldA2.text': 1 },

               cond: { } },

               reduce: function ( curr, result ) { },

               initial: { }

            } )

但这会返回一个空数组...

我怎么做才能看到执行时间?谢谢你非常匹配...

2 个答案:

答案 0 :(得分:1)

由于您运行的是2.0.4(我建议升级),您必须通过MR运行(我想,也许有更好的方法)。类似的东西:

map = function(){
    for(i in this.fieldA.fieldA2){
        emit(this.fieldA.fieldA2[i].text, 1); 
        // emit per text value so that this will group unique text values
    }
}

reduce = function(values){
    // Now lets just do a simple count of how many times that text value was seen
    var count = 0;

    for (index in values) {
        count += values[index];
    }

    return count;
}

然后会为您提供一系列文档,其中_id是来自text的唯一fieldA2值,value字段是出现的次数{i}集合。

这又是一个草案,未经过测试。

答案 1 :(得分:0)

我认为答案比Map / Reduce更简单..如果您只想要不同的值加上执行时间,以下内容应该有效:

var startTime = new Date()
var values    = db.coll.distinct('fieldA.fieldA2.text');
var endTime   = new Date();

print("Took " + (endTime - startTime) + " ms");

这将导致values数组包含不同fieldA.fieldA2.text值的列表:

[ "ciao", "hello", "yo", "sayonara" ]

报告执行时间:

Took 2 ms