Mongoose – 如何确定一个嵌套的对象是否已经存在于一个查询中?
我的数据库存储一个User
,它有一个包含嵌套对象movie
的watchMovies[]
数组。
当收到包含watchedMovie
对象的update / put API请求时, 我想检查id = zzz
的movie
是否已经存在于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 }