如何获取子文档对象的计数 - mongoDB

时间:2014-02-26 12:44:17

标签: mongodb

我在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

是否可以获得对象大小?

任何建议都会有所帮助。

2 个答案:

答案 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总是会让人混淆)。