我需要使用upsert,因为我的Accounts模式(见下文)中的记录可能不存在。其存在的决定因素是adviserID和period。如果存在与这两者相匹配的记录,则应该只更新记录。
然而,当我运行此操作时,我收到此错误:清理并向客户报告:Adviser id必须是对象[400]。当我在updateOrder方法中的console.log(顾问)时,确实报告了顾问ObjectID。
任何帮助将不胜感激。谢谢。
Upsert方法:
Meteor.methods({
updateOrder: function(adviser, order, period) {
Account.upsert(
{
adviserId: adviser,
period: period
}, {
$set: {
adviserId: adviser,
order: order,
outstanding: order,
period: period
}
});
}
});
架构:
Schema.Account = new SimpleSchema({
"adviserId": {
type: Object,
},
period: {
type: Date,
label: "Order Period"
},
order: {
type: Number,
min: 0,
label: "Order Number"
},
outstanding: {
type: Number,
min: 0,
defaultValue: 0,
label: "Outstanding Number"
}
});
答案 0 :(得分:1)
你很可能希望adviserId成为一个字符串。 MongoDB内部ID对象是Meteor中的字符串。
答案 1 :(得分:1)
这就是我们在流星中的表现。
Shares.update({
adviserId: adviser,
period: period
}, {
$set: {
adviserId: adviser,
order: order,
outstanding: order,
period: period
}
}, {
upsert: true
})
答案 2 :(得分:1)
来自SimpleSchema文档:
您的方法中的如果您有一个Object类型的键,那么该对象的属性也将被验证,因此您必须在架构中定义所有允许的属性。
adviser
应该是一个字符串,因为您将它用于查找(在upsert中)。如果您的adviser
是字符串,则只需修复{type: String, regEx: SimpleSchema.RegEx.Id}
的架构。或者,如果您想使用对象,则需要对其进行描述或添加blackbox option。
答案 3 :(得分:0)
谢谢Bryukhanov Valentin。转换为String类型解决了我的问题。
还要感谢那些回复的人。