使用组()的mongodb查询?
这是我的收藏结构:使用组()的mongodb查询?,mongodb,Mongodb,这是我的收藏结构: coll{ id:..., fieldA:{ fieldA1:[ { ... } ], fieldA2:[ { text: "ciao", }, { text: "hello", }, ] } } 我想提取集合中的所有字段a2,但如果字段a2处于两次或两次以上中,我只想显示一次 我试试
coll{
id:...,
fieldA:{
fieldA1:[
{
...
}
],
fieldA2:[
{
text: "ciao",
},
{
text: "hello",
},
]
}
}
我想提取集合中的所有字段a2
,但如果字段a2
处于两次或两次以上
中,我只想显示一次
我试试这个
Db.runCommand({distinct:’coll’,key:’fieldA.fieldA2.text’})
但什么都没有。这将返回集合中的所有filedA1
所以我试着
db.coll.group( {
key: { 'fieldA.fieldA2.text': 1 },
cond: { } },
reduce: function ( curr, result ) { },
initial: { }
} )
但这将返回一个空数组
我如何才能做到这一点,并看到执行时间??非常感谢您,match…因为您正在运行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;
}
然后将为您提供一个文档集合,\u id
是字段a2
中唯一的文本
值,值
字段是集合中出现的次数
同样,这是一份草稿,没有经过测试。我认为答案比地图/缩略图简单。。如果您只需要不同的值加上执行时间,则以下操作应该有效:
var startTime = new Date()
var values = db.coll.distinct('fieldA.fieldA2.text');
var endTime = new Date();
print("Took " + (endTime - startTime) + " ms");
这将产生一个值
数组,其中包含不同的字段a.fieldA2.text值列表:
[ "ciao", "hello", "yo", "sayonara" ]
以及报告的执行时间:
Took 2 ms
fieldA
仅显示fieldA1
及其内容的3个点,但在您的组中,您显示希望在该字段内的文本的子字段上分组。字段1的真实结构是什么?您能为示例性输入添加所需的输出吗?Sammaye:对不起。。我想在fieldA2上分组。textGrzegorz:我想要这样的列表:再见,你好。。。,所有这些只有一次。然后是查询执行时间,我相信使用聚合框架,您可能可以执行以下操作:db.col.aggregate({$project:{“fieldA.fieldA2”:1},{$unwind:$fieldA.fieldA2”},{$group:{id:$fieldA.fieldA2.text})代码>这是未经测试的,我只是把它与内存放在一起,以获得答案。。我尝试了您的代码,但出现了以下错误:map reduce失败:{“assertion”:“内存中的map/reduce数据太多”,“assertionCode”:13604,“errmsg”:“db assertion failure”,“ok”:0}@alesio1985太糟糕了,那么stennies的答案呢?我知道你以前试过distinct,但我相信如果你试一下他的例子,它会起作用的