我在mongoDB中有以下文档sample
。
{
"category" : [
{
"Type" : "one",
"Qty" : {
"10-Dec" : {
"value" : 58
},
"11-Dec" : {
"value" : 83
}
}
},
{
"Type" : "two",
"Qty" : {
"10-Dec" : {
"value" : 4
},
"11-Dec" : {
"value" : 7
},
"12-Dec" : {
"value" : 8
}
}
}
]
}
必须找出Qty对象的数量。
输入:“one”,QtyCount:2,输入:“Two”,QtyCount:3
是否可以获得对象大小?
任何建议都会有所帮助。
答案 0 :(得分:3)
我认为您应该重新考虑您的架构。如果您可以将Qty
更改为数组并将日期添加到date
字段,则会有很多帮助。
{
"Type" : "one",
"Qty" : [
{
"date": "10-Dec"
"value" : 58
},
{
"date": "11-Dec"
"value" : 83
}
]
},
{
"Type" : "two",
"Qty" : [
{
"date": "10-Dec"
"value" : 4
},
"date": "11-Dec"
"value" : 7
},
"date": "12-Dec"
"value" : 8
}
]
}
您将能够有效地使用索引和聚合框架来计算您的数量。
如果这不是一个选项,我会建议在额外字段上汇总该数据,并在插入/更新时更新该字段。
答案 1 :(得分:0)
最好更改架构,但你应该能够自己mapReduce摆脱痛苦:
mapper=function(){
for (i=0;i<this.category.length;i++){
for (q in this.category[i]['Qty']){
emit(this.category[i]['Type'], {'QtyCount':this.category[i]['value']});
}
}
}
reducer=function(k,v){
counter=0;
for (i=0;i<v.length;i++){
counter+=v[i].QtyCount;
}
return {'QtyCount':counter}
}
db.sample.mapReduce(mapper, reducer, qtycounts)
这应该会给你一个名为qtycounts的新集合,其中'Type'设置为_id,qtycounts设置为'value.QtyCount'(Mongodb总是会让人混淆)。