这是我的收藏结构:
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: { }
} )
但这会返回一个空数组...
我怎么做才能看到执行时间?谢谢你非常匹配...
答案 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