当KEY不确定时,MongoDB中的sum是如何嵌套文档的?

时间:2014-10-30 15:24:44

标签: mongodb

首先,状态代码(“200”,“404”或其他)和时间(“1000”,“2000”..)不确定,

我想计算每个状态代码的数字(5,6 ...)。

例如:{“200”:11},{“404”:11}或{“total”:22}

数据结构:

"_id"    : "xxxxx"
"domain" : "www.test.com"
"status" : [ 
               {"200" : [ {"1000" : 5}, {"2000": 6} ...]},
               {"404" : [ {"1000" : 5}, {"2000": 6} ...]}
                ....
           ]

MongoDB中的任何奇妙方法? 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

不要将数据(如日期)用作键。数据属于值。枚举HTTP状态代码 - 您知道所有可能性 - 因此您可以根据需要将它们用作键。从文档的外观来看,您将页面文档中页面请求的信息与数组中的请求一起存储。在文档中拥有一个无限的,不断增长的数组并不是一个好主意。我建议将数据重构为请求文档,并将地址非规范化为每个:

{
    "_id" : ObjectId(...),
    "status" : 404,
    "date" : ISODate("2014-10-30T18:23:09.471Z"),
    "domain" : "www.test.com"
}

然后您可以通过聚合

获取对test.com的404个请求总数
db.requests.aggregate([
    { "$match" : { "domain" : "www.test.com" } },
    { "$group" : { "_id" : "$status", "count" : { "$sum" : 1 } } }
])

domain上的索引,以加快速度。

答案 1 :(得分:0)

我认为你可以使用聚合框架来实现这样的目标。

检查一下: db.errors.aggregate([{$ unwind:“$ status”},{$ group:{_ id:“$ status”,total:{$ sum:1}}}])

它将呈现如下结果: ...     “结果”:[         {             “_ID” : {                 “500”:[                     {                         “1000”:5                     },                     {                         “2000”:6                     }                 ]             },             “总数”:1         }, ...

“总计”字段包含您要查找的计数。

希望这有帮助。

问候!