Запрос отношения «многие ко многим» в MongoDB

Я читаю MongoDB в действии и когда говорю о запрашивая отношения «многие ко многим» в документе, мне трудно понять, как он написал свой пример запроса (с использованием драйвера Ruby).

Запрос находит все продукты в определенной категории, где есть коллекции products и category. Автор говорит: «Чтобы запросить все продукты в категории «Садовый инструмент», код прост:

db.products.find({category_ids => category['id']})

Документ PRODUCT выглядит следующим образом:

doc =
{ _id: new ObjectId("4c4b1476238d3b4dd5003981"),
  slug: "wheel-barrow-9092",
  sku: "9092",
  name: "Extra Large Wheel Barrow",
  description: "Heavy duty wheel barrow...",

  details: {
    weight: 47,
    weight_units: "lbs",
    model_num: 4039283402,
    manufacturer: "Acme",
    color: "Green"
  },

  category_ids: [new ObjectId("6a5b1476238d3b4dd5000048"),
                    new ObjectId("6a5b1476238d3b4dd5000049")],

  main_cat_id: new ObjectId("6a5b1476238d3b4dd5000048"),

  tags: ["tools", "gardening", "soil"],

}

И документ CATEGORY выглядит так:

doc =
{  _id: new ObjectId("6a5b1476238d3b4dd5000048"),
   slug: "gardening-tools",
   ancestors: [{ name: "Home",
                 _id: new ObjectId("8b87fb1476238d3b4dd500003"),
                 slug: "home"
                },

                { name: "Outdoors",
                 _id:  new ObjectId("9a9fb1476238d3b4dd5000001"),
                 slug: "outdoors"
               }
   ],

   parent_id: new ObjectId("9a9fb1476238d3b4dd5000001"),

   name: "Gardening Tools",
   description: "Gardening gadgets galore!",
}

Может кто-нибудь, пожалуйста, объясните мне это немного подробнее? Я до сих пор не могу понять, как он написал этот запрос :(

Спасибо всем.


person Bohn    schedule 28.05.2012    source источник


Ответы (1)


Запрос ищет в коллекции продуктов все продукты со значением category['id'] в поле category_ids.

Когда вы ищете определенное значение в поле, содержащем массив, MongoDB автоматически перечисляет каждое значение в этом массиве в поисках совпадений.

Чтобы построить запрос, вы должны сначала заметить, что коллекция category определяет иерархию вашей категории и что каждая категория имеет уникальный идентификатор (хранится, как обычно в MongoDB, в поле _id).

Вы также должны заметить, что в коллекции product есть поле, в котором хранится список идентификаторов категорий, category_ids, которые ссылаются на уникальные идентификаторы коллекции category.

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

Если бы мне нужно было написать запрос для интерпретатора оболочки Mongo на основе javascript, mongoкоторый находит продукты в категории «Садовые инструменты», я бы сделал следующее:

  1. Look up the ID of the Gardening Tools category (which, as noted before, is stored in the _id field of the category collection)
    • In this case, the value in your example is ObjectId("6a5b1476238d3b4dd5000048")
  2. Insert the value into a query that searches through the category_ids field of the product collection
    • This is the query that you give in your question, which for the mongo shell I would write as: db.products.find({category_ids : new ObjectId("6a5b1476238d3b4dd5000048")})

Я надеюсь, что это яснее, чем исходное объяснение!

(Кроме того: я не совсем уверен, на каком языке написан ваш запрос, возможно, это PHP? В любом случае, javascript, кажется, является предпочтительным языком для примеров в документации MongoDB, потому что сервер MongoDB устанавливает команду mongo интерпретатор строки рядом с самим сервером, так что доступ к нему есть у всех)

person chrisbunney    schedule 28.05.2012
comment
Спасибо за подробное объяснение. Книга Mongodb in Action использует код Ruby для языковых примеров, подобных этому. - person Bohn; 29.05.2012
comment
Итак, в его примере «id» имеет особое значение и должен передаваться как есть? Вот где я путаюсь. - person Bohn; 29.05.2012
comment
Не имея возможности видеть книгу, похоже, что category_id может быть массивом/переменной, которую автор заполнил идентификатором нужной категории (шаг 1 в моем ответе выше). Я не знаю Ruby, поэтому мне трудно понять, как интерпретировать код. Спасибо за согласие :) - person chrisbunney; 29.05.2012