2010-05-25 3 views
3

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

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

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

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

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

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


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

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

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

ответ

4

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

Что требует MongoDB, это некоторая нормализация.

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

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

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

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

Грабилка продукты и их категории

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} }

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

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

1

Да, это единственный способ, который у вас есть. Не существует возможности объединения.

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

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


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

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

Смежные вопросы