2013-04-04 1 views
7

Вот моя коллекция MongoDB:MongoDB - агрегация - Для того, чтобы получить уникальные предметы в массиве

{ 
    "_id" : ObjectId("515d8f53175b8ecb053425c2"), 
    "category" : "Batteries", 
    "products" : [ 
     { 
      "brand" : "Duracell", 
      "item" : [ 
       "AA", 
       "AAA" 
      ] 
     }, 
     { 
      "brand" : "Everyday", 
      "item" : [ 
       "9V", 
       "AA", 
       "12V" 
      ] 
     } 
    ] 
} 

Вывод, что мне нужно

1) Уникальный список всех элементов

{["AA", "AAA", "9V", "12V"]} 

и 2. уникальный список предметов на продукт

{ 
    "category" : "Batteries", 
    "item": ["AA", "AAA", "9V", "12V"] 
} 

Я очень новичок в MongoDB, и я пробовал разные функции агрегации, и ничего не работает. Пожалуйста помоги.

ответ

14

После нескольких попыток я решил это. Вот команды:

db.xyz.aggregate({$project: {a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: 'a', items: {$addToSet: '$a'}}}); 

и

db.xyz.aggregate({$project: {category: 1, a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: '$category', items: {$addToSet: '$a'}}}); 
+4

Почему вы дважды разматываете? – Devesh

+6

, потому что «элемент» вложен в массив. – Ananth

0

Я не уверен, что вы все, что вы пробовали в функции агрегации, но я думал, что это поможет вам сделать то же самое, предполагая, что вы не в состоянии это сделать, у нас есть сокращение карты, которое позволит вам легко сделать это. Вы можете посмотреть на http://docs.mongodb.org/manual/applications/map-reduce/. Это позволяет вам получать данные так, как вы хотите, и вы можете легко получить список. Я думаю, что $ раскручивается в столбце тегов, а затем $ group они всегда дают нам список различных тегов, как вам требуется в 1, а для 2-го случая создайте $ group по двум ключевым категориям и элементам, которые были развязаны ранее.

+0

Devesh, спасибо за ваш ответ. Я смог решить это только с помощью агрегации. Отправленный мой ответ также. – Ananth