2015-03-06 3 views
0

Есть 2 коллекции 'актеров' и 'Фильмы'Запрос на поле ссылочного документа

пример 1 актер:

{ 
    _id: ObjectId("54f38bd9b814dca762778032"), 
    name: { 
    first: 'Jason', 
    last: 'Statham' 
    } 
} 

пример из 2 фильмов

{ 
    _id: ObjectId("54f5cbaf4d9f1129335993ef"), 
    title: 'Fast & Furious 7', 
    actors: [ 
    ObjectId("54f38bd9b814dca762778032") 
    ] 
}, 
{ 
    _id: ObjectId("54f782493e7688c31f75307d"), 
    title: 'Parker', 
    actors: [ 
    ObjectId("54f38bd9b814dca762778032") 
    ] 
} 

Как может Я делаю, чтобы найти фильмы с Джейсоном Стэтхэмом? Я использую Node.js + скорых + Mongoose

Благодарности

ответ

3

Это называется просить «присоединиться», которая является то, что MongoDB не может сделать.

Вы можете использовать массив .filter() в коде после запуска .populate(), но, разумеется, для этого нужно сначала «все». Вы даже можете задать запрос к .populate() в соответствии с вашими условиями. Но это все равно означает выбор всех родителей.

Вы также можете добавить «parentId» к «дочернему», и это позволит вам запросить «дочернюю» коллекцию, выбрав при необходимости только документы, которые соответствуют родительскому объекту или «обратное заполнение».

Или вы можете использовать "embedding" вместо того, чтобы пытаться воспроизвести реляционную модель и использовать движок NoSQL для этой цели. Тогда вы просите о работе.

{ 
    _id: ObjectId("54f5cbaf4d9f1129335993ef"), 
    "title": "Fast & Furious 7", 
    "actors: [ 
     { "first": "Jason", "last": "Statham" } 
    ] 
}, 
{ 
    "_id": ObjectId("54f782493e7688c31f75307d"), 
    "title": "Parker", 
    "actors": [ 
     { "first": "Jason", "last": "Statham" } 
    ] 
} 

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

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

+0

Очевидно, что я пользователь MySql, и я очень новичок в NoSQL. Я все еще пытаюсь понять понятия. В случае с пользователями/статьями мне нужно, чтобы пользователи коллекции не вошли в систему. Это нормально, если я скопирую весь документ пользователя в «авторы» в документе статьи? – Martial

+0

@Martial Хорошо. Итак, какие части до сих пор не понятны вам, что вам нужно понять? Помогите мне помочь. –

+0

Спасибо @Neil. Есть моя настоящая необходимость: пользователи могут войти в мое приложение со своим паролем. У меня есть коллекция пользователей для этого. Эти пользователи могут открывать запросы. У меня также есть «запросы» коллекции. Мне нужно указать все запросы, сделанные пользователем. В MySQL это «кусок пирога» (пальцы в носу в Fance;)), но в mongodb я потерян. – Martial

0

Предположим, вы знаете идентификатор актера Jason Statham. Все, что вам нужно сделать, это найти фильмы, где есть актер ID 54f38bd9b814dca762778032, который является _id Джейсоном Стэтхэмом. Это пример.

model.find({actors: "54f5cbaf4d9f1129335993ef"}, function(err, movies) { 
    // You get all movies which an actor Jason Statham 
}); 

И ваш фильм Схема должна быть такой.

var movieSchema = new Schema({ 
    title: String, 
    actors: Array 
}); 

Надеюсь, это может вам помочь.