Mongoose对象没有方法保存

时间:2015-08-18 15:16:59

标签: node.js mongodb express mongoose

在我发布这个问题之前,我已经在google上做了很多搜索,但仍然没有任何帮助。所以我的问题是,我想在查询之后更新我的数据库,之前已经创建了对象,但是每当我想要更新它时,都会出现一个错误,说我的对象没有方法保存。

TypeError: Object { session_key: '-----',
poll_id: '-----',
status: 'xxxxx',
_id: xxxx,
__v: 0 } has no method 'save'
at Promise.<anonymous> (/home/albert/gampangpoll/server.js:971:18)
at Promise.<anonymous> (/home/albert/gampangpoll/node_modules/mongoose/node_ modules/mpromise/lib/promise.js:177:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/home/albert/gampangpoll/node_modules/mongoose/node_modules /mpromise/lib/promise.js:84:38)
at Promise.fulfill (/home/albert/gampangpoll/node_modules/mongoose/node_modu les/mpromise/lib/promise.js:97:20)
at /home/albert/gampangpoll/node_modules/mongoose/lib/query.js:1056:26
at model.Document.init (/home/albert/gampangpoll/node_modules/mongoose/lib/d ocument.js:254:11)
at completeMany (/home/albert/gampangpoll/node_modules/mongoose/lib/query.js :1054:12)
at Object.cb (/home/albert/gampangpoll/node_modules/mongoose/lib/query.js:10 20:11)
at Object._onImmediate (/home/albert/gampangpoll/node_modules/mongoose/node_ modules/mquery/lib/utils.js:137:16)

这是我的猫鼬模式:

var RoomSchema = new Schema ({
 status : String,
 session_key : String,
 poll_id : String,
 jml_peserta : Number
});

这里是代码产生错误的地方:

Room.find({'session_key': input_skey}, function(err, room){
 room.jml_peserta += 1;
 room.save();

我试图将对象名称从room更改为liveroom,以防万一它不区分大小写,但是,仍然没有任何变化。我也尝试另一种方式,几个小时的调试,但问题仍然存在。请帮帮我,非常感谢你。

2 个答案:

答案 0 :(得分:1)

使用find,回调的room参数将是文档的数组,而不仅仅是一个。切换到使用findOne代替:

Room.findOne({'session_key': input_skey}, function(err, room){
  room.jml_peserta += 1;
  room.save();
});

但是就像布雷克评论的那样,你应该使用原子update代替这种类型的改变:

Room.update({'session_key': input_skey}, 
            {$inc: {jml_peserta: 1}},
            function(err, numAffected){ ... });

答案 1 :(得分:0)

find为您提供了一系列文档。

如果您确定只有一个文档session_key并且想要使用save,则可以使用以下脚本。

Room.find({'session_key': input_skey}, function(err, room){
    room.jml_peserta += 1;
    room[0].save();
}

但是,您可以使用findOneAndUpdate查找单个文档并进行更新。 findOneAndUpdate优于更新的优点是您可以使用该文档发送响应等。

Room.findOneAndUpdate({'session_key': input_skey},
    {$inc: {jml_peserta: 1}},
      function (err, room) {
         //Your code
      }
   );

如果您只是不想要文档,可以使用update

Room.update({'session_key': input_skey},
    {$inc: {jml_peserta: 1}},
      function (err, numberOfUpdates) {
         //Your code
      }
   );