Mongoose setDefaultsOnInsert和2dsphere索引不起作用
如果在使用findOneAndUpdate
和upsert并将setDefaultsOnInsert
设置为true时尝试在数据库中插入新用户时遇到问题。 我想要做的是设置下面的模式的默认值:
var userSchema = new mongoose.Schema({ activated: {type: Boolean, required: true, default: false}, facebookId: {type: Number, required: true}, creationDate: {type: Date, required: true, default: Date.now}, location: { type: {type: String}, coordinates: [] }, email: {type: String, required: true} }); userSchema.index({location: '2dsphere'});
findOneAndUpdate
代码:
model.user.user.findOneAndUpdate( {facebookId: request.params.facebookId}, { $setOnInsert: { facebookId: request.params.facebookId, email: request.payload.email, location: { type: 'Point', coordinates: request.payload.location.coordinates } } }, {upsert: true, new: true, setDefaultsOnInsert: true}, function (err, user) { if (err) { console.log(err); return reply(boom.badRequest(authError)); } return reply(user); });
正如你所看到的,我也存储了用户的经纬度,这就是问题的出发点。 当findOneAndUpdate
被调用时,我得到这个错误:
{ [MongoError: exception: Cannot update 'location' and 'location.coordinates' at the same time] name: 'MongoError', message: 'exception: Cannot update \'location\' and \'location.coordinates\' at the same time', errmsg: 'exception: Cannot update \'location\' and \'location.coordinates\' at the same time', code: 16836, ok: 0 }
当我删除2dsphere索引和所有位置相关的代码它确实设置我的creationDate。 我做错了什么?
setDefaultsOnInsert
选项使用$setOnInsert
运算符来执行它的function,看起来像是和你自己使用$setOnInsert
设置location
冲突。
解决方法是删除setDefaultsOnInsert
选项,并将其全部放在您自己的$setOnInsert
运算符中:
model.user.user.findOneAndUpdate( {facebookId: request.params.facebookId}, { $setOnInsert: { activated: false, creationDate: Date.now(), email: request.payload.email, location: { type: 'Point', coordinates: request.payload.location.coordinates } } }, {upsert: true, new: true}, function (err, user) { if (err) { console.log(err); return reply(boom.badRequest(authError)); } return reply(user); });
其中一位开发者回应了我在github上的问题,并将其添加为4.0.8发布的里程碑,这是他的解决方法:
$setOnInsert: { facebookId: request.params.facebookId, email: request.payload.email, 'location.type': 'Point', 'location.coordinates': request.payload.location.coordinates }
他的解决scheme不适合我,我得到以下错误:
{ [MongoError: exception: insertDocument :: caused by :: 16755 Can't extract geo keys from object, malformed geometry?: { _id: ObjectId('559024a0395dd599468e4f41'), facebookId: 1.020272578180189e+16, location: { coordinates: [], type: "Point" }, email: "druwe.jeroen@gmail.com", gender: "male", lastName: "Druwé", firstName: "Jeroen", __v: 0, activated: false, creationDate: new Date(1435509921264), familyDetails: { children: [] } }]