【发布时间】:2016-07-30 07:00:06
【问题描述】:
我需要有关 findOneAndUpdate({upsert: true}) 查询的帮助:
得到了这个模式:
usersSchema = new Schema(
{
name: {type: String, unique: true, uniqueCaseInsensitive: true}, // username
password: {type: String, minlength: 4},
slug: {type: String, unique: true, uniqueCaseInsensitive: true}, // ok - Automatic on backend - based on name
firstName: {type: String},
middleName: {type: String},
lastName: {type: String},
email: {type: String, unique: true, uniqueCaseInsensitive: true},
//country: {type: String, required: true, minlength: 3}
socialIDs: {
facebook: {
id: {type: String, unique: true}
},
twitter: {},
google: {}
}
}
当用户是新用户时,使用 facebook(使用 passportjs)创建帐户,firstName、lastName、email 等的数据将填充 facebook 检索到的数据。如果用户通过本地策略创建了他的帐户,则这些字段可能不存在,并且在他第一次使用 facebook 登录时,它们会被填充(更新个人资料)。
完美。
现在让我们说,用户通过在线表格手动更新他的个人资料,在他第一次使用 facebook 登录之前,并设置一个电子邮件地址(不同于与他的 facebook 帐户关联的)。
当他用他的 facebook 登录时,电子邮件地址将被从他的 facebook 帐户中检索到的电子邮件地址覆盖。
有没有办法将 findOneAndUpdate() 方法设置为只插入不存在的键(或者可能是给定键默认值的值)?
可能以某种方式将 $set 与 $exists 运算符结合起来(我试过这个,但找不到正确的语法)
我使用的查询如下:
User.findOneAndUpdate(
{
$or: [
{email: profile._json.email},
{socialIDs: {facebook: {id: profile._json.id}}}
]
},
{
$set: {
firstName: profile._json.first_name,
middleName: profile._json.middle_name,
lastName: profile._json.last_name,
avatar: profile._json.picture,
gender: profile._json.gender,
email: profile._json.email,
socialIDs: {
facebook: {
id: profile._json.id,
profileLink: profile._json.link,
}
}
}
},
{new: true, upsert: true},
function(err, user){
done(err, user)
});
谢谢大家!
【问题讨论】:
标签: javascript node.js mongodb mongoose passport.js