我有一个包含以下文件的集合 -
{
"_id" : ObjectId("56e7a51b4a66e30330151847"),
"host" : "myTestHost.com",
"sessionId" : "daxxxxxx-xxxx-xxxx-xxxx-xxxxxxx1",
"ssoId" : "xxxxxx@gmail.com",
"days" : {
"13" : NumberLong(130),
"11" : NumberLong(457),
"10" : NumberLong(77)
},
"count" : NumberLong(664),
"timeStamp" : NumberLong("1458021713370")
}
我正在使用mongo java驱动程序3.2.1。 本文档包含嵌入式文档“天数”,其中包含每月每天的特定计数。 我需要找到计数存在的天数。例如 - 对于上面提到的文件,计数的天数是3(月份的第13天,第11天和第10天)。 我知道如何计算mongo控制台 -
mongos>var count = 0;
mongos> db.monthData.find({},{days:1}).forEach(function(record){for(f in record.days) { count++;}});
mongos> count;
我需要将其转换为java代码。
答案 0 :(得分:1)
也许您可以按照以下方式重塑您的架构:
{
"_id" : ObjectId("56e7a51b4a66e30330151847"),
"host" : "myTestHost.com",
"sessionId" : "daxxxxxx-xxxx-xxxx-xxxx-xxxxxxx1",
"ssoId" : "xxxxxx@gmail.com",
"days" : [
{
"13" : NumberLong(130)
},
{
"11" : NumberLong(457)
},
{
"10" : NumberLong(77)
}
],
"count" : NumberLong(664),
"timeStamp" : NumberLong(1458021713370)
}
days
成为一个对象数组,通过这种方式,您可以轻松使用聚合管道来了解days
数组中有多少个元素:
>db.collection.aggregate(
[
{$match:{days:{"$exists":1}}},
{$project:{
numberOfDays: {$size:"$days"},
_id:1}
}
]
)
聚合返回:
{ "_id" : ObjectId("56e7a51b4a66e30330151847"), "numberOfDays" : 3 }
要将聚合管道与Java驱动程序一起使用,请参阅aggregate
,AggregateIterable
,Block
并阅读Data Aggregation with Java Driver