更新MongoDB集合 - JavaScript

时间:2013-01-04 13:11:11

标签: node.js mongodb mongoose

我正在尝试更新集合中的值。用户单击一个按钮,与该按钮对应的数字将被发送到服务器以添加到集合中。

我无法更新集合,但如果我使用db.orders.update()

,它在控制台中可以正常工作

订单型号:

// DB Initiation stuff

var orderSchema = new mongoose.Schema({ 
    status: String,
    rated: Number
});

var collection = 'orders';
var Order = db.model('Order', orderSchema, collection);

module.exports = Order;

客户端(按钮点击时)

// starID = 5; id = 50e6a57808a1d92dcd000001
socket.emit('rated', {rated: starID, id: id});

socket.js:

var Order = require('../models/orders');

socket.on('rated', function(data) { 
  /* Probably a better way to do this but, wrap
   * the id in 'ObjectId(id)'
   */
  var id = 'ObjectId("'+data.id+'")';
  Order.update( {_id: id}, {$set: {rated: data.rated}} );
   socket.emit('updated', {
     note: 'Some HTML notification to append'
   });  
});

3 个答案:

答案 0 :(得分:1)

让Mongoose将id字符串转换为ObjectId

socket.on('rated', function(data) { 
  Order.update( {_id: data.id}, {$set: {rated: data.rated}} );
   socket.emit('updated', {
     note: 'Some HTML notification to append'
   });  
});

答案 1 :(得分:0)

Mongoose期望String为id。因此传递ObjectId不起作用。 尝试:

Order.update( {_id: id.toString()}, ....... );

使用带有String和ObjectId的toString是安全的。

答案 2 :(得分:0)

我尝试了所有陈述但它似乎没有用,所以我将更新代码更改为:

Order.findOne({_id : id}, function(err, doc) {
  doc.rated = data.rated;
  doc.status = data.status;
  doc.save();
});

现在它工作正常。感谢所有为回答做出贡献的人