2015-02-20 4 views
0

У меня есть следующие данные. Я хочу группировать по полям в массиве.Mongodb Group по количеству На основании полей массива

{ 
    "_id" : ObjectId("54e73137758646882f445383"), 
    "items" : [ 
    { 
     "name" : "one", 
     "quality" : "high" 
    }, 
    { 
     "name" : "one", 
     "quality" : "low" 
    }, 
    { 
     "name" : "two", 
     "quality" : "high" 
    } 
    ] 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("54e73166758646882f445384"), 
    "items" : [ 
    { 
     "name" : "two", 
     "quality" : "high" 
    }, 
    { 
     "name" : "three", 
     "quality" : "low" 
    }, 
    { 
     "name" : "four", 
     "quality" : "medium" 
    } 
    ] 
} 

Я хочу сгруппировать по имени и качеству, и я хочу получить счет.

Это то, что я пытался

db.testColl.aggregate({$group : { 
      _id : {itemsName : "$items.name" ,itemsQuality : "$items.quality" }, 
      count : {$sum : 1} 
    }}) 

и я получаю результат, как

{ 
    "result" : [ 
    { 
     "_id" : { 
      "itemsName" : [ 
       "two", 
       "three", 
       "four" 
      ], 
      "itemsQuality" : [ 
       "high", 
       "low", 
       "medium" 
      ] 
     }, 
     "count" : 1 
    }, 
    { 
     "_id" : { 
      "itemsName" : [ 
       "one", 
       "one", 
       "two" 
      ], 
      "itemsQuality" : [ 
       "high", 
       "low", 
       "medium" 
      ] 
     }, 
     "count" : 1 
    } 
    ], 
    "ok" : 1 
} 

Ожидаемый результат:

{ 
"result" : [ 
    { 
     "_id" : { 
      "itemsName" : one, 
      "itemsQuality" : high 
     }, 
     "count" : 1 
    }, 
     { 
     "_id" : { 
      "itemsName" : one, 
      "itemsQuality" : low 
     }, 
     "count" : 1 
    }, 
    { 
     "_id" : { 
      "itemsName" : two, 
      "itemsQuality" : high 
     }, 
     "count" : 2 
    }, 

    .... 
    ], 
    "ok" : 1 
} 

Возможно ли это? Если это так поможет мне в этом? Если это невозможно, пожалуйста, исправьте мою структуру, чтобы достичь результата.

ответ

2

Попробуйте это будет решить вашу проблему

db.collectionName.aggregate({ 
    "$unwind": "$items" 
}, { 
    "$group": { 
    "_id": { 
     "itemsName": "$items.name", 
     "itemsQuality": "$items.quality" 
    }, 
    "count": { 
     "$sum": 1 
    } 
    } 
}) 
+0

Thanks свою работу – Ramesh

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