我有一系列包含用户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"
]
}
原来我触发了位于同一页面的提交表单。即使我打电话的事件不是“提交表格”。它有一个表格,所以提交仍然通过。此外,我在表单提交和按钮触发器中使用相同的变量名称,因此插入方法仍然存在 谢谢你的答案,但事实证明问题出在其他地方,完全是我的错:)
答案 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的答案。
我希望这会有所帮助。