我有10 000 000条通话记录的收集数据库。 我想比较上个月到下个月的通话使用情况。
收集文件的例子
{
"_id" : ObjectId("54ed74d76c68d23af73e230a"),
"msisdn" : "9818441000",
"callType" : "ISD"
"duration" : 10.109999656677246,
"charges" : 200,
"traffic" : "Voice",
"Date" : ISODate("2014-01-05T19:51:01.928Z")
}
{
"_id" : ObjectId("54ed74d76c68d23af73e230b"),
"msisdn" : "9818843796",
"callType" : "Local",
"duration" : 1,
"charges" : 150,
"traffic" : "Voice",
"Date" : ISODate("2014-02-04T14:25:35.861Z")
}
持续时间是我的用法。
我想将ISODate("2014-01-04T14:25:35.861Z")
的持续时间与下个月ISODate("2014-02-04T14:25:35.861Z")
的所有记录进行比较。
两个月内所有msisdn
个数字相同。
答案 0 :(得分:0)
这里明显的调用似乎是聚合数据,在MongoDB中聚合框架非常适合。以我在此处看到的一般用例字段为例。是的,我们通常用离散月来谈论,而不是假定从当前时间点开始一个月的某个值:
db.collection.aggregate([
{ "$match": {
"msisdn": "9818441000",
"Date": {
"$gte": new Date("2014-01-01"),
"$lt": new Date("2014-03-01")
}
}},
{ "$group": {
"_id": {
"year": { "$year": "$Date" },
"month": { "$month": "$Date" },
"callType": "$callType",
"traffic": "$traffic"
},
"charges": { "$sum": "$charges" },
"duration": { "$sum": "$duration" }
}},
{ "$sort": { "_id": 1 } }
])
目的是在响应中生成两个记录,表示每个月的不同值。
您基本上可以获取这两个结果,并在客户端代码中比较它们之间的差异。
或者你可以在所有" MSISDN"在文档中成对分组的月份值:
db.collection.aggregate([
{ "$match": {
"Date": {
"$gte": new Date("2014-01-01"),
"$lt": new Date("2014-03-01")
}
}},
{ "$group": {
"_id": {
"year": { "$year": "$Date" },
"month": { "$month": "$Date" },
"msisdn": "$msisdn",
"callType": "$callType",
"traffic": "$traffic"
},
"charges": { "$sum": "$charges" },
"duration": { "$sum": "$duration" }
}},
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": {
"msisdn": "$_id.msisdn",
"callType": "$_id.callType",
"traffic": "$_id.traffic"
},
"data": { "$push": {
"year": "$_id.year",
"month": "$_id.month",
"charges": "$charges",
"duration": "$duration"
}}
}}
])