У меня есть коллекция с кучей сообщений тела. Например:
posts = { { id: 0, body: "foo bar baz", otherstuff: {...} },
{ id: 1, body: "baz bar oof", otherstuff: {...} },
{ id: 2, body: "baz foo oof", otherstuff: {...} }
};
Я бы хотел выяснить, как перебрать каждый документ в коллекции и вести подсчет каждого слова в каждом теле сообщения.
post_word_frequency = { { foo: 2 },
{ bar: 2 },
{ baz: 3 },
{ oof: 2 },
};
Я никогда не использовал MapReduce, и я все еще новичок в монго, но я смотрю документацию по http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
map = function() {
words = this.body.split(' ');
for (i in words) {
emit({ words[i] }, {count: 1});
}
};
reduce = function(key, values) {
var count = 0;
values.forEach(function(v) {
count += v['count'];
});
return {count: count};
};
db.posts.mapReduce(map, reduce, {out: post_word_frequency});
Как дополнительная сложность, я делаю это в node.js (с node-mongo-native, хотя я готов переключиться на выполнение запроса на уменьшение, если есть более простой способ).
var db = new Db('mydb', new Server('localhost', 27017, {}), {native_parser:false});
db.open(function(err, db){
db.collection('posts', function(err, col) {
db.col.mapReduce(map, reduce, {out: post_word_frequency});
});
});
Пока что мне трудно из-за того, что этот узел говорит мне ReferenceError: post_word_frequency is not defined
(я пытался создать его в оболочке, но это все равно не помогло).
Так кто-нибудь делал mapreduce с помощью node.js? Это неправильное использование для уменьшения карты? может быть другой способ сделать это? (возможно, просто зациклить и вставить в другую коллекцию?)
Спасибо за любые отзывы и советы! :)
РЕДАКТИРОВАТЬ Ryanos ниже был верным (спасибо!), Что-то, чего не хватало в моем решении на основе MongoDB - это поиск коллекции и преобразование ее в массив.
db.open(function(err, db){
db.collection('posts', function(err, col) {
col.find({}).toArray(function(err, posts){ // this line creates the 'posts' array as needed by the MAPreduce functions.
var words= _.flatten(_.map(posts, function(val) {