Mongoose – 如何确定一个嵌套的对象是否已经存在于一个查询中?

我的数据库存储一个User ,它有一个包含嵌套对象moviewatchMovies[]数组。

当收到包含watchedMovie对象的update / put API请求时, 我想检查id = zzzmovie是否已经存在于watchedMovie[]数组中

问题是,这个查询不这样做。 我究竟做错了什么?

 User.find( { username: req.params.username, 'watchedMovies.movie.id': movie.id }, function (err, count) { if (!err) exist = true; } ); 

下面的完整代码:

架构

 var userSchema = new Schema({ username: { type: String, require: true }, firstName: String, lastName: String, ... watchedMovies : [{ movie: { type: Schema.Types.ObjectId, ref: 'Movie' }, time: Date, watchedDuration: Number, }], }) 

JSON请求体

 { "id": "10-things-i-hate-about-you", //movie id "time": "2012-05-29T17:57:30.169Z", "watchedDuration": "88" } 

mongoose查询

 router.put('/:username/watchedMovies', function (req, res, next) { //find movie Movie.findOne({ id: req.body.id }, function (err, movie) { if (err) res.send(err); //find if user already has the movie in the watchedMovies list var exist = false; User.find( { username: req.params.username, 'watchedMovies.movie.id': movie.id }, function (err, count) { if (!err) exist = true; } ); //if movie is already in watchedList, update User with it if (exist) { //set existing watchedMovie object User.update(...$set...) } else { // push new User.findOneAndUpdate(...$push...) } }); }); 

我认为这是问题,这是你的模式

 var userSchema = new Schema({ username: { type: String, require: true }, firstName: String, lastName: String, ... watchedMovies : [{ movie: { type: Schema.Types.ObjectId, ref: 'Movie' }, time: Date, watchedDuration: Number, }], }) 

但你的查询是

 { username: req.params.username, 'watchedMovies.movie.id': movie.id } 

不要使用movie.id

尝试这个

 { username: req.params.username, 'watchedMovies.movie': movie.id }