Я разрабатываю веб-приложение с помощью Codeigniter и MongoDB. Я пытаюсь заставить карту свести к работе.Сводка для подсчета меток
У меня есть файл с нижерасположенной структурой. Я хотел бы сделать карту уменьшить до проверить, сколько раз каждый тег используется и выводить его в коллекцию files.tags.
{
"_id": {
"$id": "4f26f21f09ab66c1030d0000e"
},
"basic": {
"name": "The filename"
},
"tags": [
"lorry",
"house",
"car",
"bicycle"
],
"updated_at": "2012-02-09 11:08:03"
}
Я попробовал эту карту сократить команду, но это не считается каждый отдельный тег:
$map = new MongoCode ("function() {
emit({tags: this.tags}, {count: 1});
}");
$reduce = new MongoCode ("function(key , values) {
var count = 0;
values.forEach(function(v) {
count += v['count'];
});
return {count: count};
}");
$this->mongo_db->command (array (
"mapreduce" => "files",
"map" => $map,
"reduce" => $reduce,
"out" => "files.tags"
)
);
Работал отлично! Прямо сейчас каждый документ в files.tags получает _ID из имени тега. Я хотел бы предоставить каждому документу обычный MongoId, а затем добавить тег: «thetag» для каждого документа. Как я могу это сделать? –
@JonathanClark: из моей практики сокращение карты всегда медленное, и я стараюсь избегать этого. Или, если это действительно необходимо, я перехожу к фоновому асинхронному процессу или использую [incremental] (http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-MongoShellScriptwithIncrementalMapReduceandFinalize). Map/reduce быстрее, потому что он работает с не полным источник данных. Таким образом, общая карта/сокращение неприемлема для расчетов в реальном времени, особенно с большими объемами данных. –
Да, это печально. Вы знаете, как использовать обычные MongoIds вместо того, чтобы устанавливать _id в имя тега? И вместо этого добавьте имя тега в документ? –