MongoDB поиск многие ко многим - PullRequest
1 голос
/ 15 декабря 2011

это мои коллекции: (многие ко многим)

актеры:

{
 _id: 1,
 name: "Name 1"
}

фильмы:

{
  _id: 1,
  name: "The Terminator",
  production_year: 1984,
  actors: [
            {
              actors_id: 1,
              role_id : 1
            },
            {
             actors_id: 2,
             role_id : 1
            }
          ]
}

Я не могу получить список актеров для какого-нибудь фильма

это не проблема, когда у меня есть это:

{
  _id: 1,
  name: "The Terminator",
  production_year: 1984,
  actors: [1,2,3,4,5] (actors id's)
}

var a = db.movies.findOne(name:"The Terminator").actors
db.actors.find({"_id":{$in:a}})

но как мне сделать это с такой структурой:

если я сделаю это var a = db.movies.findOne(name:"The Terminator").actors

возвращает мне это:

[
 {
  actors_id: 1,
  role_id : 1
 },
 {
  actors_id: 2,
  role_id : 1
 }
]

Как получить только это в массиве [1,2] (ctors_id) для получения имен актеров (с $ in)

Спасибо, Зоран

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Ты не.В MongoDB вы всегда запрашиваете документы, поэтому вы должны убедиться, что ваша схема такова, что вы можете получить всю необходимую вам информацию, запрашивая конкретные документы.В MongoDB нет функциональности, подобной объединению / просмотру.

Денормализация обычно является наиболее подходящим выбором в таких случаях.Ваша схема выглядит так, как будто она разработана для традиционной реляционной базы данных, и вам придется попробовать и отпустить некоторые принципы проектирования схемы, которые идут с реляционными данными.

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

Наконец, подумайте, используете ли вы правильный инструмент для того, что вам нужно сделать.Слишком часто люди думают, что MongoDB - это «быстрый MySQL», что совершенно неверно.Базы данных документов сильно отличаются от СУБД и даже к / х хранилищ.Если у вас много связанных данных, используйте СУБД.

0 голосов
/ 15 декабря 2011

переменная a в db.movies.findOne(name:"The Terminator").actors представляет собой массив документов, поэтому вам нужно будет сделать его массивом целых чисел (идентификаторов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...