MongoDb嵌套数组查询以下关系

时间:2014-02-21 12:30:41

标签: arrays node.js mongodb mongoose mongodb-query

假设我有一个用户架构:

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'}
                    } ]
})

我需要推送一个新用户进入此架构,但我还需要检查用户当前是否跟随用户(重复条目)但不确定如何执行此查询

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

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

})

但它不起作用。

我想在执行查询并手动检查之后避免循环使用currentUser.userFollows数组

我需要推送的最终userFollows对象如下所示:

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

2 个答案:

答案 0 :(得分:1)

有两种方法可以执行此更新(使用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")
                                   }
                   }
     }
)

其中说:对于此用户,还没有这个关注者,$推送此对象。

显然你会填写适当的字段 - 我只是从你的问题中剪切一些样本值以显示完整的格式。

答案 1 :(得分:0)

结帐this关于在更新查询中向嵌套数组添加数据。

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