Да, 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 элементов в каждой категории, то вы, вероятно, захотите хранить больше информации о категории в каждом элементе.