是否可以在MongoDB中对单个采集的两个月数据进行比较?

是否可以在MongoDB中对单个采集的两个月数据进行比较?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有10万个电话记录的收集数据库。 我想比较上个月和下个月的通话使用情况 收款凭证示例 { "_id" : ObjectId("54ed74d76c68d23af73e230a"), "msisdn" : "9818441000", "callType" : "ISD" "duration" : 10.109999656677246, "charges" : 200, "traffic" : "Voice", "Date" : ISODat

我有10万个电话记录的收集数据库。 我想比较上个月和下个月的通话使用情况

收款凭证示例

{
    "_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都是相同的。

这里最明显的要求似乎是聚合数据,在MongoDB中,聚合框架非常适合这样做。以我在这里看到的通用用例字段为例。是的,我们通常以离散的月份来讨论,而不是假设从当前时间点算起一个月:

db.collection.aggregate([
{“$match”:{
“msisdn”:“9818441000”,
“日期”:{
“$gte”:新日期(“2014-01-01”),
“$lt”:新日期(“2014-03-01”)
}
}},
{“$组”:{
“_id”:{
“年”:{“$year”:“$Date”},
“月”:{“$month”:“$Date”},
“callType”:“$callType”,
“流量”:“$流量”
},
“费用”:{“$sum”:“$charges”},
“持续时间”:{“$sum”:“$duration”}
}},
{“$sort”:{“\u id”:1}
])
其目的是在响应中生成两条记录,将每个月表示为一个不同的值

您基本上可以获取这两个结果,并在客户端代码中比较它们之间的差异

或者,您可以在文档中将月份分组成对的所有“MSISDN”值上执行此操作:

db.collection.aggregate([
{“$match”:{
“日期”:{
“$gte”:新日期(“2014-01-01”),
“$lt”:新日期(“2014-03-01”)
}
}},
{“$组”:{
“_id”:{
“年”:{“$year”:“$Date”},
“月”:{“$month”:“$Date”},
“msisdn”:“$msisdn”,
“callType”:“$callType”,
“流量”:“$流量”
},
“费用”:{“$sum”:“$charges”},
“持续时间”:{“$sum”:“$duration”}
}},
{“$sort”:{“\u id”:1},
{“$组”:{
“_id”:{
“msisdn”:“$\u id.msisdn”,
“callType”:“$\u id.callType”,
“流量”:“$\u id.traffic”
},
“数据”:{“$push”:{
“年”:“$\u id.year”,
“月”:“$\u id.month”,
“费用”:“$charges”,
“持续时间”:“$duration”
}}
}}
])

@Niel Lunn感谢您的回答,但我想比较所有MSISDN,而不仅仅是一个MSISDN,它给出的输出如下{“年”:2014,“月”:2,“日”:10,“呼叫类型”:“NA”,“流量”:“数据”},“费用”:302900,“持续时间”:13902.000002503395}{“年”:2014,“月”:2,“日”:11,“呼叫类型”:“NA”,“流量”:“数据”},“费用”:318450,“持续时间”:14504.99966025352}是否可以只显示所有持续时间比上个月更长的msisdn号?@dilshad是的。只需从
$match
中删除特定的msisdn值,并将其作为
\u id
复合字段中的一个字段放置在
$group
中。您还可以进一步分解这些对通过额外的
$group
将每个月推入一个数组。您应该先尝试一下,如果遇到问题,您可以随时提出另一个问题。我已经多次尝试了`db.CDR.aggregate([{$match:{traffic:{traffic:{Data}},{$group:{u id:{“Msisdn”:“$Msisdn”,“month”:”$date“},{$project:{“msisdn”:1,“month”:{“$month”:“$date”}},{“$sort”:{“month”:1},{“$project”:{“msisdn”:1,“date”:1,}}}`@dilshad希望附加的信息能让你对此有更多的了解。@Niel我也尝试过这个代码

match={“$match”:{“Date”:{“$gt”:新日期(2014,2,1)},{traffic:“Data”}}};proj1={“$project”:{“$id”:0,“Date 1”,msisdn:1,“h”:{“$hour”:“$Date$Date“}”,ml:{“$毫秒”:“$Date”}}};group={“$group”:{“$id”:{“msisdn”:“$msisdn”,“Date”:“$Date”},“总持续时间”:{“$sum”:“$Duration”},Count:{“$sum”:“$1}};db.CDR.aggregate(match,proj1,proj2,group)