Перечислите связанные теги для сообщений блога, хранящихся в MongoDB - PullRequest
4 голосов
/ 06 января 2011

Я пытаюсь выяснить, как получить список связанных тегов из сообщений блога, хранящихся в MongoDB.

Структура данных

{
    title: "Post #1",
    tags: { "news", "politics" }
},
{
    title: "Post #2",
    tags: { "news", "entertainment" }
},
{
    title: "Post #3",
    tags: { "entertainment", "music", "theatre" }
},
{
    title: "Post #4",
    tags: { "entertainment", "music", "concerts" }
}

Желаемый результат

Если я хочу получить список тегов, связанных с «развлечениями», он запрашивает сообщения, чтобы найти похожие теги.Подобные теги также используются, когда сообщение помечено как «развлечение».

Я бы хотел получить следующий результат:

Tag       Count
========  ======
music     2    (because there are 2 posts tagged with music + entertainment)
concert   1
theatre   1
news      1

Есть ли способчтобы это было как можно ближе к этому?Самое близкое, что я смог получить, это использовать db.posts.find({tags: "entertainment"});, а затем перебрать и построить эти значения за пределами MongoDb.Я ищу более эффективный способ.

Ответы [ 2 ]

1 голос
/ 06 января 2011

Вы можете переместить работу в сторону записи, чтобы поддерживать быстрое чтение.Допустим, вы пытаетесь добавить new_tag к сообщению, которое уже имеет some_list_of_tags.Следующий код создаст коллекцию с нужными значениями:

for old_tag in some_list_of_tags:
    db.related_tags.update({'_id':new_tag}, {'$inc':{'counts.'+old_tag:1}}, upsert=True)
    db.related_tags.update({'_id':old_tag}, {'$inc':{'counts.'+new_tag:1}}, upsert=True)

Затем, чтобы получить результаты для развлечения, просто выполните:

db.related_tags.find({'_id': 'entertainment'})

Вы можете использовать findAndModify команда для атомарного добавления тега в сообщение и извлечения всех существующих тегов:

old_tags = db.posts.findAndModify({query: {_id: ID},
                                   update: {$addToSet: {tags: new_tag}},
                                   fields: {tags: 1}
                                  })['tags']
0 голосов
/ 06 января 2011

Вы не найдете его.MongoDB имеет очень ограниченные (но очень эффективные) возможности запросов.Для чего-то подобного вам понадобится карта / уменьшение, но поскольку MongoDB M / R сегодня однопоточный, и это JS-движок не самый быстрый, вы можете в конечном итоге найти лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...