mongoDB много ко многим с одним запросом? - PullRequest
3 голосов
/ 26 мая 2010

в MySQL я использую JOIN, и один запрос не проблема. как насчет монго?

Представьте себе категории и продукты.

продукты могут иметь больше категорий. категории могут иметь больше продукта. (структура "многие ко многим") и администратор может редактировать категории в администрации (категории должны быть разделены)

можно ли написать продукт с именами категорий в одном запросе?

я использовал эту структуру

categories {
   name:"categoryName",
         product_id:["4b5783300334000000000aa9","5783300334000000000aa943","6c6793300334001000000006"]
}


products  {
    name:"productName",
category_id:["4b5783300334000000000bb9","5783300334000000000bb943","6c6793300334001000000116"]
}

теперь я могу просто получить все категории продуктов и продукты в некоторых категориях и только для редактирования. но если я хочу написать продукт с именами категорий, мне нужно два запроса - один для получения идентификатора категории продукта и второй для получения названий категорий из этих идентификаторов.

это правильный путь? или эта структура не подходит? Я хотел бы иметь только один запрос, но я не знаю, возможно ли это.

Ответы [ 2 ]

5 голосов
/ 26 мая 2010

Да, MongoDB особенно плох в этом конкретном типе операций. Однако это также вопрос масштабов. Если у вас 30 миллионов продуктов и вы хотите объединить 3 миллиона продуктов в их категории, вы обнаружите, что во многих базах данных это не очень быстро (даже если это одна строка кода).

Здесь MongoDB требует некоторой ненормализации.

Ваши коллекции, вероятно, будут выглядеть так:

categories {
  _id:"mongoid",
  name:"categoryName",
  ...
}

products  {
  _id:"mongoid",
  name:"productName",
  categories:[
    {"4b5783300334000000000bb9":'categoryName'},
    {"5783300334000000000bb943":'CategoryName2'},
    {"6c6793300334001000000116":'categoryName3'}
  ]
}

Вот как это будет работать (приблизительная оценка, мой экземпляр Mongo не пригодится):

Схватить продукты и их категории

db.products.find({"_id": {$in:[1,2,3]}, {name:1,categories:1})

Получить товары определенной категории:

db.products.find({"categories.0": {$in:[x,y,z]}},{categories:1,name:1} }

Да, это не совсем то же самое. И вам придется обновлять всех записей о продуктах, когда вы изменяете название категории. Я знаю, это кажется странным, но это стандартно для денормализации.

Кстати, я предполагаю, что у вас будет много продуктов и значительно меньше категорий. Этот метод, вероятно, лучше всего, если вы скажете 100 пунктов в каждой категории. Если у вас есть 5 элементов в каждой категории, то вы, вероятно, захотите хранить больше информации о категории в каждом элементе.

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

Да, только так. Нет возможности присоединиться.

Но вы можете добавить много информации в свои категории или документ продукта, например:

categories {
   name:"categoryName",
         product_id:[ {"4b5783300334000000000aa9": 'productName'},{"5783300334000000000aa943":'productName2'},{"6c6793300334001000000006":'productName3'}]
}


products  {
    name:"productName",
category_id:[{"4b5783300334000000000bb9":'categoryName'},{"5783300334000000000bb943":'CategoryName2',{"6c6793300334001000000116":'categoryName3'}]
}

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

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