假设我有一个用户架构:
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")
}
答案 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 } }
);