2015-10-04 4 views
1

У меня JSON со следующей структуройMongoDB кол массив объектов по значению

db.testCollection.insert(
{ 
    "m_id": 2, 
    "sys_data":[ 
    {"sattr": 
     { 
     "size": 2, 
     "d_data": 
     [ 
      {"d_counter": 2, 
      "client_ip":"1.1.1.1", 
      "d_date":"02/01/01"} 
      {"d_counter": 2, 
      "client_ip":"1.1.1.1", 
      "d_date":"02/01/01"} 
      {"d_counter": 2, 
      "client_ip":"1.1.1.1", 
      "d_date":"03/01/01"} 
     ] 
     } 
    } 
    ] 
} 

db.testCollection.insert(
{ 
    "m_id": 2, 
    "sys_data":[ 
    {"sattr": 
     { 
     "size": 2, 
     "d_data": 
     [ 
      {"d_counter": 2, 
      "client_ip":"1.1.1.1", 
      "d_date":"02/01/01"} 
     ] 
     } 
    } 
    ] 
} 

Я хочу, чтобы получить количество, где d_date = '02/01/01' , так что выход для выше JSON равно 3. (два из первого и один JSON со второго)

ответ

0

Используйте aggregation framework, чтобы получить счет. Это позволяет $unwind в глубоко вложенных встроенных документов (с помощью dot notation), отфильтровать нежелательные документы с помощью оператора $match, который похож на запрос find() и использовать $sum аккумулятор оператора в конвейере $group, чтобы определить количество соответствующих документов.

Что-то вроде этого:

коллекция тест Populate:

db.testCollection.insert([ 
{   
    "m_id" : 2, 
    "sys_data" : [ 
     { 
      "sattr" : { 
       "size" : 2, 
       "d_data" : [ 
        { 
         "d_counter" : 2, 
         "client_ip" : "1.1.1.1", 
         "d_date" : "02/01/01" 
        }, 
        { 
         "d_counter" : 2, 
         "client_ip" : "1.1.1.1", 
         "d_date" : "02/01/01" 
        }, 
        { 
         "d_counter" : 2, 
         "client_ip" : "1.1.1.1", 
         "d_date" : "03/01/01" 
        } 
       ] 
      } 
     } 
    ] 
}, 
{ 
    "m_id" : 2, 
    "sys_data" : [ 
     { 
      "sattr" : { 
       "size" : 2, 
       "d_data" : [ 
        { 
         "d_counter" : 2, 
         "client_ip" : "1.1.1.1", 
         "d_date" : "02/01/01" 
        } 
       ] 
      } 
     } 
    ] 
}]) 

Run агрегация трубопровода:

var pipeline = [ 
    { 
     "$match": { 
      "sys_data.sattr.d_data.d_date" : "02/01/01" 
     } 
    }, 
    { 
     "$unwind": "$sys_data" 
    }, 
    { 
     "$unwind": "$sys_data.sattr.d_data" 
    }, 
    { 
     "$match": { 
      "sys_data.sattr.d_data.d_date" : "02/01/01" 
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "count": { "$sum": 1 } 
     } 
    } 
]; 
db.testCollection.aggregate(pipeline); 

Пример вывода:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : null, 
      "count" : 3 
     } 
    ], 
    "ok" : 1 
} 
+1

Спасибо, Chridam. Это сработало. –

0

проверить этот docs from mongodb

db.testCollection.count({ d_date : "02/01/01" }) 

Кроме того, указанное эквивалентно:

db.testCollection.find({ d_date: "02/01/01" }).count() 

Если вы чувствуете себя медленным контролем производительности this question.

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