mongoose更新总是给我TypeError:不能设置未定义的属性'__v'

我试图更新一个socketId为''每当用户断开连接。 但不知何故,我总是得到这个错误

update.$setOnInsert[this.schema.options.versionKey] = 0; ^ TypeError: Cannot set property '__v' of undefined 

例如,如果有人被断开,我的目标

 socketId = ZH_Ic0zD8QkmNYuJAAAE; will be socketId = ''; 

这是代码

  socket.on('disconnect', function() { console.log(socket.id); var disconnectSocketId = ''; User.findOneAndUpdate({socketId: socket.id}, disconnectSocketId, {upsert: true, new: true}, function(err, doc) { if (err) { return console.error } console.log(doc.socketId); }); }); 

你的代码有几个问题。

更新 :传递socket.id作为query对象的问题显然已经解决了您的问题的最新编辑。

最重要的是,TypeError指示显然没有对象update.$setOnInsert (我明白this.schema.options.versionKey包含string"__v" ),所以你试图给一个未定义的对象分配一个属性。 你应该首先以某种方式初始化它:

 var update = { $setOnInsert: {}, $set: {} ... } 

如果我得到了你的想法,你想传递$setOnInsert对象作为文档对象的一部分findOneAndUpdate() ,对不对? 您的函数参数化看起来不正确: disconnectSocketId应该保存带有要更新的字段的文档对象,但是只传递一个空string。 还只是传递socket.id作为查询对象看起来不正确。 此外:确定要清除标识符来更新logging…? 最后:请注意,如果您通过使用$setOnInsert更新您的字段,如果您查询的logging已经存在(即拥有该ID),这实际上不会更新您的数据。

假设update代表持有关于字段的信息的对象以及它们应该如何更新,我想你正在尝试做类似的事情:

 User.findOneAndUpdate({ socketId: socket.id }, update, { upsert: true, new: true }, function(err, doc) { ... } 

请务必查看$ setOnInsert的mongoDB文档以及findOneAndUpdate的 mongoose文档