2014-09-28 3 views
1

Учитывая следующие данные в MongoDB:Совокупные наборы в надмножеству

[ 
    { id: 1, stuff: ["A", "B"] }, 
    { id: 2, stuff: ["B", "C"] }, 
    ... (lots and lots of records) 
] 

Можно ли получить объединение всех «материал» множеств? например ["A","B","C"]

Я попытался с помощью $addToSet

aggregate([ 
    { $group: { 
     _id: null, 
     allStuff: { $addToSet: "$stuff" } 
    } 
    } 
]) 

но создает множество наборов например [ ["A", "B"], ["B", "C"] ]

+0

Все возможно. Вы что-то вникали в это, или просто хотите, чтобы другие люди работали на вас? –

+0

@SalvadorDali Я пытался использовать '$ addToSet'. Отредактированный вопрос, чтобы показать, что я сделал до сих пор. Просмотрел документы, но не смог найти другую ссылку для установки union. – Constantinos

ответ

1

Ok, после того, как показывает вашу попытку, вот что вы можете сделать:

db.a.aggregate([ 
    { $unwind : "$stuff" }, 
    { $group : { 
    _id: null, 
    all : {$addToSet : "$stuff"} 
    }} 
]) 

В начале это unwinds всех элементов в массивах, которые у вас есть, а затем просто пытается добавить их все к задавать.

db.a.insert({ id: 1, stuff: ["A", "B"] }) 
db.a.insert({ id: 2, stuff: ["B", "C"] }) 
db.a.insert({ id: 3, stuff: ["A", "B", "C", "D"] }) 

дает вам: { "_id" : null, "all" : [ "D", "C", "B", "A" ] }

+0

Спасибо - как дорого стоит $ расслабиться? Я ожидаю иметь несколько тысяч записей, а средний размер массива «stuff» будет 10-20. – Constantinos

+0

@ Константинос жаль, но мне сложно дать оценку. Я могу просто сказать, что несколько тысяч супер мало для баз данных. Вы также можете использовать [foreach] (http://stackoverflow.com/a/22890331/1090562), чтобы собрать все элементы в массив, а затем найти все уникальные элементы. Но сделайте измерения, чтобы узнать, какой из них лучше. –

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