更新数组对象会创建一个新的空对象

时间:2015-08-24 09:08:23

标签: javascript mongodb meteor

我有一系列包含用户ID,金额和订单本身的订单。每个用户一次只能有一个订单,但我尝试添加一个选项来编辑您的订单。我创建了一个应该这样做的方法:

'click .edit': function (event) {
       var order = $('#editOrder').val();
       var price = $('#editPrice').val();
       Meteor.call('changeOrder', Router.current().data()._id, Meteor.userId(), order, price);
       Session.set("editing", false);
   },
changeOrder: function (id, user, order, amount) {

           Polls.update({_id: id, 'Orders.User': user}, {$set: {'Orders.$': {
                       User: user,
                       Order: order,
                       Amount: parseFloat(amount)
                   }}});
   },

这个方法实际上有效,但问题是我每次编辑订单时都会创建一个具有相同用户ID和空订单和金额属性的新对象。
老实说我不知道​​是什么原因导致更新功能插入无效数据。

这是一个带有额外空订单的Poll结构示例:

{
"_id" : "4wGAPfxCvKfH4L8JL",
"Company" : "FirmaTest",
"Restaurants" : [ 
    "Trylinka", 
    "Da Grasso", 
    "Faster", 
    "Green Way", 
    "Telepizza", 
    "Piramida"
],
"Expires" : ISODate("2015-08-24T08:26:00.791Z"),
"Votes" : {
    "Trylinka" : 1,
    "Da Grasso" : 0,
    "Faster" : 2,
    "Green Way" : 3,
    "Telepizza" : 0,
    "Piramida" : 0
},
"Voted" : [ 
    "TfQM7954a5SHoR9os"
],
"Winner" : "Green Way",
"Orders" : [ 
    {
        "User" : "TfQM7954a5SHoR9os",
        "Order" : "Some chicken",
        "Amount" : 15
    }, 
    {
        "User" : "TfQM7954a5SHoR9os",
        "Order" : null,
        "Amount" : NaN
    }
],
"Ordered" : [ 
    "TfQM7954a5SHoR9os"
]
}

解决

原来我触发了位于同一页面的提交表单。即使我打电话的事件不是“提交表格”。它有一个表格,所以提交仍然通过。此外,我在表单提交和按钮触发器中使用相同的变量名称,因此插入方法仍然存在 谢谢你的答案,但事实证明问题出在其他地方,完全是我的错:)

3 个答案:

答案 0 :(得分:0)

您是否可以使用字符串而不是ObjectID查询_id

尝试使用以下内容将id转换为ObjectID

new Meteor.Collection.ObjectID(valuefromhtml)

所以你的代码将是:

Polls.update({
    _id: new Meteor.Collection.ObjectID(id),
    'Orders.User': user
}, {
    $set: {
        'Orders.$': {
            User: user,
            Order: order,
            Amount: parseFloat(amount)
        }
    }
});

答案 1 :(得分:0)

不确定该bug是什么,但您不需要使用该更新“覆盖”整个对象,这可能是导致此问题的原因。您只需更新实际可能发生变化的两个属性:

Polls.update(
  {_id: id, 'Orders.User': user},
  {$set:
    {'Orders.$.Order': order, 'Orders.$.Amount': parseFloat(amount)}
  }
);

答案 2 :(得分:0)

尝试将upsert设置为false:

Polls.update({_id: id, 'Orders.User': user},
             {$set:
                 {'Orders.$':
                   {
                     User: user,
                     Order: order,
                     Amount: parseFloat(amount)
                   }
                 }
             },
             { upsert: false });

如果这不起作用,请尝试使用upsert: false关于BraveKenny的答案。

我希望这会有所帮助。