MongoDb嵌套数组查询以下关系

说我有一个用户架构:

UserSchema = new Schema({ name: { first: { type: String, trim: true }, last: { type: String, trim: true } }, username: { type: String, trim: true, required: true }, email: { type: String, trim: true, required: true }, hashed_password: { type: String, trim: true, required: true }, profile_image: { type: String, trim: true, default: 'default' }, join_date: { type: Date, required:true }, userFollows: [ { status : { type: String, enum: [ 'following', 'followed_by' ]}, added : { type: Date, required:true }, user : { type: Schema.ObjectId, ref: 'User'} } ] }) 

我需要推新的用户closures到这个架构,但我也需要检查用户目前不跟随用户(重复条目),但不知道如何执行此查询

我试图使用的当前查询是:

 User .findOne( { username: req.user.username }, { "userFollows.user": { $not: req.body.userID } } ) .exec(function (err, currentUser) { }) 

但它不工作。

我想避免在执行查询和手动检查后通过currentUser.userFollows数组循环

最终用户closures对象我需要推动看起来像这样:

 { _id: ObjectId("53073acd9256e81e4d7b5d8e"), status: "followed_by", added: ISODate("2014-02-21T11:38:53.828Z"), user: ObjectId("51c6ec9fedc1230700000007") } 

有两种方法可以执行此更新(在shell语法中):

 db.users.update( { "username": req.user.username }, { $addToSet : { userFollows : { _id: ObjectId("53073acd9256e81e4d7b5d8e"), status: "followed_by", added: ISODate("2014-02-21T11:38:53.828Z"), user: ObjectId("51c6ec9fedc1230700000007") } } } ) 

其中说,为这个用户,添加到userFollows数组这个对象(除非它已经在那里)。

另一种方法是:

 db.users.update( { "username": req.user.username, "userFollows.user": { $ne: req.body.userID } }, { $push : { userFollows : { _id: ObjectId("53073acd9256e81e4d7b5d8e"), status: "followed_by", added: ISODate("2014-02-21T11:38:53.828Z"), user: ObjectId("51c6ec9fedc1230700000007") } } } ) 

其中说:对于这个用户,谁没有这个追随者,$推这个对象。

很明显,你会填写适当的字段 – 我只是从你的问题中剪下一些样本值来显示完整的格式。

检查一下在更新查询中向嵌套数组添加数据。

 db.collection.update( { username: req.user.username }, { $addToSet: { "userFollows.user": req.user.usernameThatIAdd } } );