LINUX.ORG.RU

MongoDB. Как выполнить запрос?

 ,


0

1

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

// "полуный путь: корневая-категория/родительская-категория/имя-категории"
сategory = {
  _id: new ObjectId(),
  slug: "имя-категории",
  ancestors: [{
    name: "Корневая категория",
    _id: new ObjectId(),
    slug: "корневая-категория"
  },
  {
    name: "Родительсяка категория",
    _id: new ObjectId(),
    slug: "родительская-категория"
  }],
  parentId: new ObjectId(),

  name: "Имя этой категории",
  description: "Описание этой категории"
}
slug - документа НЕ является уникальным. Допустим, есть подкатегория «сувениры/куклы», а есть «игрушки/куклы». Поэтому когда приходит запрос «аксессуары/волосы/заколки», нужно найти документ, у которого первый ancestor будет «аксессуары», второй ancestor «волосы», третий «заколки». Не могу понять, как выполнить поиск такого документа, если вообще за один запрос к БД такой поиск можно выполнить. Буду очень благодарен за помощь. п.с. пример, конечно, несколько надуманный, но суть от этого не меняется.



Последнее исправление: redAutumn (всего исправлений: 2)

в неявном виде: find ({ ancestors.slug: {'$in':[«кукла»,«барби»," тополя"]}}). Вообще для прохода по списку хэшей используется специальная конструкция что-то через $$

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Вообще запрос:

db.categories.find({'ancestors.slug': {$all:["кукла","Барби"]}})
не годиться, потому что будут найдены предки «волосы/заколки» и «заколки/волосы», а не хотелось бы подобного. Хочется, чтобы порядок в массиве и в запросе соответствовали. Например, если:
  ancestors: [{
    name: "Корневая категория",
    _id: new ObjectId(),
    slug: "корневая-категория"
  },
  {
    name: "Родительсяка категория",
    _id: new ObjectId(),
    slug: "родительская-категория"
  }]
то правильный запрос был всего один:
db.categories.find({'ancestors.slug': {$all:["корневая-категория","родительская-категория"]}})
, а не
db.categories.find({'ancestors.slug': {$all:["родительская-категория","корневая-категория"]}})

redAutumn
() автор топика
Ответ на: комментарий от redAutumn

Можно еще напрямую, в хардкоде так сказать:

db.categories.find({
'ancestors.0.slug': "корневая-категория", 
'ancestors.1.slug': "родительская-категория"
});
gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

gh0stwizard, очень благодарен и признателен Вам! От души п.с. конечно надо читать доки, но так вышло что у меня учебный проект стал опережать мою способность читать документацию на английском. Еще раз спасибо!

redAutumn
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.