Javascript 更新数组对象将创建新的空对象

Javascript 更新数组对象将创建新的空对象,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我有一个包含用户ID、金额和订单本身的订单数组。每个用户一次只能有一个订单,但我正在尝试添加一个选项来编辑您的订单。我创建了一个应该这样做的方法: 'click .edit': function (event) { var order = $('#editOrder').val(); var price = $('#editPrice').val(); Meteor.call('changeOrder', Router.current().data().

我有一个包含用户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和空订单和金额属性的新对象。
我真的不知道是什么原因导致更新函数插入无效数据。

下面是具有额外空顺序的轮询结构的示例:

{
"_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"
]
}

解决了的 原来我触发了位于同一页面的提交表单。尽管我所调用的事件不是“表单提交”,但它有一个表单,因此提交仍然进行。此外,我在表单提交和按钮触发器中使用了相同的变量名,因此插入方法仍然有效。

谢谢您的回答,但问题出在其他地方,完全是我的错:)

您是否可以用字符串而不是ObjectID查询
\u 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)
        }
    }
});

您是否可以使用字符串而不是ObjectID查询
\u 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)
        }
    }
});

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

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

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

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

Polls.update({_id: id, 'Orders.User': user},
             {$set:
                 {'Orders.$':
                   {
                     User: user,
                     Order: order,
                     Amount: parseFloat(amount)
                   }
                 }
             },
             { upsert: false });
如果这不起作用,请尝试对BraveKenny的答案使用
upsert:false

我希望这有帮助。

尝试设置为false:

Polls.update({_id: id, 'Orders.User': user},
             {$set:
                 {'Orders.$':
                   {
                     User: user,
                     Order: order,
                     Amount: parseFloat(amount)
                   }
                 }
             },
             { upsert: false });
如果这不起作用,请尝试对BraveKenny的答案使用
upsert:false

我希望这有帮助