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: [] } }]