2015-04-18 4 views
0

У меня есть схемы для ActorCollections и фильмы:Как я могу запросить субдокументы MongoDB с помощью мангуста?

var mongoose = require("mongoose"); 

var movieSchema = new mongoose.Schema({ 
    title : String, 
    score : Number, 
    year : String, 
    imdbId : String, 
    timestamp: { type : Date, default: Date.now }, 
}); 
var actorCollectionSchema = new mongoose.Schema({ 
    imdbId : String, 
    movies: [movieSchema], 
    actor: String, 
    timestamp: { type : Date, default: Date.now }, 
}); 

module.exports = mongoose.model('ActorCollection', actorCollectionSchema); 

Я хотел бы, чтобы сформировать запрос, который первым находит правильный actorCollection, то от этого actorCollection.movies массива найти фильм по какой-то собственности.

Я попытался

ActorCollection.findOne({imdbId: imdbId}, function(err, collection){ 
    //collection.movies is my array 
    // any mongoose methods to query this array??? 
} 

Я также видел методы, используя $ elemMatch, чтобы найти элементы, вложенные в подразделах документы, но я не уверен, как первый фильтр по ActorCollection. Если несколько актеров появляются в одном фильме, я не могу определить, какой ActorCollection я буду изменять.

Любые идеи? Могу ли я объединить запросы, чтобы достичь этого?

+0

Вы можете принять любой ответ, который решил вашу проблему. – chridam

ответ

1

Использование elemMatch:

ActorCollection 
    .findOne({"imdbId": imdbId) 
    .elemMatch("movies", {"title":"foo"}) 
    .exec(cb); 
1

Это в конечном итоге работает для меня. Мне пришлось разделить запросы на отдельные аргументы.

ActorCollection.findOne({ 
     imdbId: imdbId, 
    }, 
    { 
     movies: { $elemMatch: { 
      title: "Movie title" 
     }}, 
    }, function(err, movie){ 
     movie 
    }) 
Смежные вопросы