0

我在 Meteor 中使用 Simple Schema、collection hooks 和 Autoform 包,并且我试图在 after update 集合 hook 中更新我的模式中的 Embedded 对象。我觉得我可能会做一些愚蠢的事情,但就是无法解决这个问题。我在保存时遇到了异常:Exception while invoking method '/providers/update' Error: 0 must be an integer 我的架构:

Schemas.Providers = new SimpleSchema({
email: {
type: String,
label: 'Email Address',
autoValue: function() {
  if (this.isInsert || this.isUpdate) {
    return Meteor.user().emails[0].address;
  }
},
autoform: {
  afFieldInput: {
    type: 'email'
  }
 }
},
officelocation: {
 type: String,
 label: 'Location of Office',
 optional:true
},
location: {
 type: [LocationSchema],
 optional:true
}});

有效的收集钩子:

Providers.after.update(function (userId, doc) {
var oldDoc = this.previous;
Providers.direct.update({_id: doc._id},{$set: {location:{
    type:'Point',
    coordinates:[0,0]
}}});
});

不起作用的集合挂钩.. 理想情况下,我不应该在集合更新后更新,但想确保它有效:

Providers.after.update(function (userId, doc) {
var oldDoc = this.previous;
var array=[];
var iArray=doc.officelocation.split(",");
array.push(Number(iArray[1]));
array.push(Number(iArray[0]))
Providers.direct.update({_id: doc._id},{$set: {location:[{
    type:'Point',
    coordinates:array
}]}}); 
});
4

1 回答 1

0

查看您要存储的内容,使用 parseInt 而不是您正在使用的 Number。它将返回一个 mongo 可以存储的整数。


问题不在于您使用的方法。这与您在 mongo 中存储数据的方式有关。向我们展示您的 LocationSchema 的外观。

细节:

Mongo 使用与 javascript 不同的数字格式。在 javascript 中,数字可以是整数、浮点数、小数或任何你想要的。Mongo 对整数或浮点数有非常严格的要求。

总体而言,这意味着如果您想在 mongo 中存储一个准确的十进制数(我怀疑您正在尝试做什么),您必须将其存储为字符串(您失去了执行直接 mongo 操作的能力,例如如 $inc $gt 等)或将其分成两部分并单独存储。第三种选择是将其存储为不准确的浮点数,仅当您想要某种近似值时才有用。

于 2015-05-02T01:35:24.633 回答