2012-05-28 5 views
0

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

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

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

ПРОДУКТ, как это:

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"], 

} 

И КАТЕГОРИЯ док, как это:

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!", 
} 

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

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

ответ

3

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

При поиске в поле, которое содержит массив для определенного значения, MongoDB автоматически перечисляется каждое значение в массиве поиск для матчей.

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

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

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

Если бы я был написать запрос для интерпретатора на основе Монго Javascript оболочки, mongo что найти продукты в категории Садоводство Инструменты, я хотел бы сделать следующее:

  1. Посмотрите идентификатор категории Садоводство Инструменты (который, как уже отмечалось ранее, сохраняется в _id поле category коллекции)
    • в этом случае значение в вашем примере является ObjectId("6a5b1476238d3b4dd5000048")
  2. Вставьте значение в запрос, который ищет через category_ids поле product коллекции
    • Это запрос, который вы даете в вашем вопросе, который для mongo оболочки я бы написать так: db.products.find({category_ids : new ObjectId("6a5b1476238d3b4dd5000048")})

Надеюсь, что это яснее оригинального объяснения!

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

+0

Спасибо за подробное объяснение. Mongodb в книге действий использует код Ruby для таких примеров языка. – Bohn

+0

Итак, в его примере «id» имеет особое значение и должен быть передан как есть? Вот где я запутался. – Bohn

+0

Не имея возможности увидеть книгу, похоже, что 'category_id' может быть массивом/переменной, которую автор заполнил идентификатором нужной категории (шаг 1 в моем ответе выше). Я не знаю Ruby, поэтому трудно понять, как интерпретировать код. Спасибо за согласие :) – chrisbunney