Совокупные наборы в надмножество

Учитывая следующие данные в 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"] ]


person Constantinos    schedule 28.09.2014    source источник
comment
Все возможно. Вы думали об этом или просто хотите, чтобы другие люди работали на вас?   -  person Salvador Dali    schedule 28.09.2014
comment
@SalvadorDali Я пытался использовать $addToSet. Отредактированный вопрос, чтобы показать, что я сделал до сих пор. Просмотрел документы, но не нашел другой ссылки на set union.   -  person Constantinos    schedule 28.09.2014


Ответы (1)


Хорошо, после показа вашей попытки, вот что вы можете сделать:

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

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

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" ] }

person Salvador Dali    schedule 28.09.2014
comment
Спасибо. Сколько стоит $unwind? Я ожидаю, что у меня будет несколько тысяч записей, а средний размер массива будет 10-20. - person Constantinos; 28.09.2014
comment
@Constantinos Извините, но мне трудно дать оценку. Я могу только сказать, что несколько тысяч — это очень мало для баз данных. Вы также можете попробовать использовать foreach, чтобы собрать все элементы в массив, а затем найти все уникальные элементы. Но сделайте замеры, чтобы узнать, какой из них лучше. - person Salvador Dali; 28.09.2014