Получить список всех уникальных тегов в mongodb
Я начинаю с mongodb и имею коллекцию с документами, которые выглядят следующим образом
{
"type": 1,
"tags": ["tag1", "tag2", "tag3"]
}
{
"type": 2,
"tags": ["tag2", "tag3"]
}
{
"type": 3,
"tags": ["tag1", "tag3"]
}
{
"type": 1,
"tags": ["tag1", "tag4"]
}
При этом мне нужен набор всех тегов для определенного типа. Например, для типа 1 я хочу набор tag1, tag2, tag3, tag4
(любой порядок).
Все, что я мог придумать, - это получить теги и добавить их в set
в python, но я хотел знать, есть ли способ сделать это с mongodb mapreduce или чем-то еще. Просьба сообщить.
Ответы
Ответ 1
Если вам нужен только (отдельный) список тегов, то использование отдельных будет лучше. Map/Reduce будет медленнее и не может использовать индекс для части javascript.
http://docs.mongodb.org/manual/reference/method/db.collection.distinct/
db.coll.distinct("tags", {type:1})
Вернет набор тегов для type = 1.
Ответ 2
Вы правы, Map/Reduce может работать на то, что вы пытаетесь выполнить, но Set может быть быстрее и меньше кода.
> m = function() {
... for (var tag in this.tags) {
... emit(this.tags[tag], 1);
... }
... }
> r = function(key, values) {
... return 1;
... }
> db.tags.mapReduce(m, r).find()
{ "_id" : "tag1", "value" : 1 }
{ "_id" : "tag2", "value" : 1 }
{ "_id" : "tag3", "value" : 1 }