2016-03-15 5 views
0

У меня есть набор, содержащий следующие документы -Подсчет количества полей в документе Монго Java

{ 
    "_id" : ObjectId("56e7a51b4a66e30330151847"), 
    "host" : "myTestHost.com", 
    "sessionId" : "daxxxxxx-xxxx-xxxx-xxxx-xxxxxxx1", 
    "ssoId" : "[email protected]", 
    "days" : { 
      "13" : NumberLong(130), 
      "11" : NumberLong(457), 
      "10" : NumberLong(77) 
    }, 
    "count" : NumberLong(664), 
    "timeStamp" : NumberLong("1458021713370") 
} 

Я использую драйвер Монго Java 3.2.1. Этот документ содержит встроенный документ «дни», который содержит определенный счетчик для каждого дня месяца. Мне нужно найти количество дней, для которых присутствует счет. Например, для упомянутого выше документа количество дней, для которых есть счет, составляет 3 (13, 11 и 10 числа месяца). Я знаю, как получить счет на Монго консоли -

mongos>var count = 0; 
mongos> db.monthData.find({},{days:1}).forEach(function(record){for(f in record.days) { count++;}}); 
mongos> count; 

Мне нужно преобразовать это в Java код.

ответ

1

Может быть, вы можете изменить вашу схему следующим образом:

{ 
    "_id" : ObjectId("56e7a51b4a66e30330151847"), 
    "host" : "myTestHost.com", 
    "sessionId" : "daxxxxxx-xxxx-xxxx-xxxx-xxxxxxx1", 
    "ssoId" : "[email protected]", 
    "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 } 

Использование Aggregation трубопроводов с драйвером Java см aggregate, AggregateIterable, Block и читать Data Aggregation with Java Driver

+0

$ существует не будет использовать индексы, так что если у нас есть записи в миллионах будут медленнее, я думаю. Пожалуйста, предлагайте. – viren

Смежные вопросы