0

这是我的收藏结构:

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

我想提取fieldA2我收藏中的所有内容,但如果在其中fieldA2two 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: { }

            } )

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

我怎么能这样做并查看执行时间?谢谢你很配...

4

2 回答 2

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是集合中出现的次数。

同样,这是一个草案,未经测试。

于 2012-12-18T10:35:14.817 回答
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
于 2012-12-18T10:51:10.803 回答