Я боролся с этим уже около 2 дней, и любая помощь будет принята с благодарностью.В настоящее время у меня есть очень большая коллекция MongoDB (более 100 миллионов документов) в следующем формате:
[_id]
[date]
[score]
[meta1]
[text1]
[text2]
[text3]
[text4]
[meta2]
Это не точные данные, я немного запутал их для целей этого поста, но схема идентична, и формат этих данных не может быть изменен, просто так оно и есть.
Там находится ТОННА дублирующихся записей, задание выполняется один раз в день, добавляя деньмиллионы записей в базе данных, которые могут иметь те же данные в текстовых полях, но разные значения для полей Score, meta1 и meta2.Поэтому мне нужно исключить дубликаты и объединить все в одну коллекцию без повторяющихся текстов:
Сначала я собираюсь объединить текстовые поля и хэшировать результат, поэтому у меня нет дубликатов, содержащих одинаковые текстовые поля (эта часть проста и уже работает).
Вот где я борюсь: в результирующей коллекции будет массив каждого уникального meta1, который, в свою очередь, будет массивом, содержащим совпадающие с ним даты и оценки.
Так что если у меня естьследующие три документа в моей коллекции сейчас:
[_id] => random mongoid
[date] => 12092010
[score] => 3
[meta1] => somemetadatahere
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[meta2] => uniquemeta2data
[_id] => random mongoid
[date] => 12092010
[score] => 5
[meta1] => othermetadata
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[meta2] => uniquemeta2data1
[_id] => random mongoid
[date] => 12102010
[score] => 7
[meta1] => somemetadatahere (same meta1 as the first document)
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[meta2] => uniquemeta2data
Они должны быть сведены к этой коллекции (отступы - это вложенные документы / массивы).Ключи в массиве данных взяты из значений поля meta1 в исходной коллекции:
[_id]=> (md5 hash of all the text fields)
[text1] => foo
[text2] => bar
[text3] => foo2
[text4] => bar2
[datas]
[somemetadatahere]
[meta2] => uniquemeta2data
[scores]
[12092010]=>3
[12102010]=>7
[othermetadata]
[meta2] => uniquemeta2data1
[scores]
[12092010]=>3
Это похоже на идеальный вариант использования для задания MapReduce, но у меня возникают проблемы с обертываниемкак именно это сделать.
Кто-нибудь готов помочь мне разобраться?