计算文档mongo Java中的字段数

时间:2016-03-15 11:15:19

标签: java mongodb

我有一个包含以下文件的集合 -

{
    "_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代码。

1 个答案:

答案 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驱动程序一起使用,请参阅aggregateAggregateIterableBlock并阅读Data Aggregation with Java Driver