Mongodb, простая проблема IN - PullRequest
0 голосов
/ 24 мая 2010

Я новичок в Монго, это мой дизайн БД:

product := { 
    name: str
    group: ref,
    comments: [ ref, ref, ref, ref ] 
}

comments := { 
... a bunch of comments stuff

} 

tag := { 
    _id: int,               #Need this for online requests
    tag: str,
    products: [ {product: ref, score: float}, ... ],
    comments: [ {comment: ref, score: float}, ...],
}

Итак, мой шаблон использования: ПОДАРИ продукт, находите комментарии с определенным тегом и сортируйте их соответствующим образом.

Мой текущий подход включает в себя:

  1. Ищите тот объект тега, который имеет тег = MyTag
  2. вытащить все комментарии, отсортировано
  3. искать этот продукт, где product.name = MyProduct
  4. вытащить все комментарии (которые между прочим)
  5. цикл через результат 2, и проверка, если они в 4, (это я можно сделать предел 10) и т. д.

Это довольно неэффективно. Есть ли лучшие методы?

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Причина, по которой такой подход неэффективен, заключается в том, что вы действительно разработали свою базу данных, чтобы сделать этот процесс неэффективным.

Вы собрали коллекцию "tags" как родитель для коллекции "comments". Но затем вы говорите, что хотите загрузить «комментарии» по «тегу».

Обычно в тегах "комментарии" или "продукты" тег " принадлежит " комментарию "или" продукту ". Но вы изменили это, вы ссылаетесь на комментарии из тегов вместо того, чтобы искать комментарий по тегу.

Я думаю, что вы ищете что-то вроде этого.

  • Товар содержит комментарии
  • Товар может быть помечен
  • Комментарий может быть помечен
  • Все теги имеют оценку

Вот как выглядит эта структура данных:

product := { 
    name: str,
    group: ref,
    tags: [ {ref, score}, {ref, score},... ]
    comments: [ { ref, tags: [ {ref, score}, {ref, score},... ] },
                { ref, tags: [ {ref, score}, {ref, score},... ] }, ... 
              ]
}

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

С точки зрения «индексации» вы можете индексировать в массивах. Таким образом, вы можете настроить индекс для product.tags и product.comments.tags.

Теперь ваш запрос намного проще. Вы можете буквально просто взять Product, а затем перебрать массив Comments в поисках подходящего тега. Или вы можете выполнить запрос на стороне сервера и заставить его упорядочить теги по баллам.

0 голосов
/ 24 мая 2010

Я не уверен, правильно ли я понял, что вы пытаетесь сделать, но если каждый комментарий может иметь несколько тегов и является комментарием к отдельному продукту, то вы можете сделать так, чтобы каждый комментарий имел поля тегов и продуктов. Тогда ваши комментарии будут выглядеть так:

comment := {
    product: product_id,
    tags: [tag1, tag2, ... ]
    ...
}

Тогда, учитывая продукт, вы можете сделать:

db.comments.find({product : productId, tags : myTag})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...