Хорошо, я хочу создать какой-то алгоритм MapReduce для создания обратного индекса для текстовых документов.
В части картирования я делаю что-то вроде этого
letters = ['a']
regx = re.compile("^("+"|".join(letters)+')')
selectedWords = directIndex.aggregate([
{ "$match": { "words.word": regx } },
{ "$unwind": "$words" },
{ "$match": { "words.word": regx } },
{ "$group": { "_id": { "word":"$words.word", "count":"$words.count", 'document' : '$document' } } }])
Хорошо, здесь я выбираю все слова и информацию, связанную с ними, по первой букве. После этого я записываю эту информацию в другую коллекцию:
myinvcol.insert_one({'letter':str(''.join(letters)),'words':selectedWords })
На следующем шаге я читаю каждый вставленный документ и выполняю операцию dict dict ('wordName': {documents: [document1: count1, document2: count2 и т. Д.], 'WordName2: {documents: [...] } ') и выполните некоторые дополнительные операции над этим диктом
Теперь самое интересное)):
Можно ли сделать первый шаг (часть карты) или агрегацию, чтобы полностью выполнить на сервере MongoDB? Другими словами, я знаю, что есть оператор $ out:
letters = ['a']
regx = re.compile("^("+"|".join(letters)+')')
selectedWords = directIndex.aggregate([
{ "$match": { "words.word": regx } },
{ "$unwind": "$words" },
{ "$match": { "words.word": regx } },
{ "$group": { "_id": { "word":"$words.word", "count":"$words.count", 'document' : '$document' } } }
{ "$out" : 'InverseIndex'}])
Позволяет мне записать результат агрегата в другую коллекцию, но не выполняет то, что я хочу: вместо вставки одного документа:
{'letter':str(''.join(letters)),'words':selectedWords },
я получил много вставок
{ "_id": { "word":"$words.word", "count":"$words.count", 'document' : '$document' } }.
Итак, в заключение, существует ли способ создать документ в агрегации, который объединит все его результаты в одном массиве перед оператором $ out?