流星与mongo upsert

时间:2016-02-23 13:12:15

标签: mongodb meteor upsert

我需要使用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"
  }
});

4 个答案:

答案 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类型解决了我的问题。

还要感谢那些回复的人。