Mongodb 流星随蒙戈上升

Mongodb 流星随蒙戈上升,mongodb,meteor,upsert,Mongodb,Meteor,Upsert,我需要使用upsert,因为我的帐户模式(见下文)中的某个记录可能不存在。其存在的决定性因素是时间和时间。如果存在与这两项匹配的记录,则只需更新该记录 但是,当我运行此程序时,我得到以下错误:已清理并报告给客户端:Adviser id必须是一个对象[400]。当我在updateOrder方法中console.log(advisor)时,它确实正确地报告了advisor ObjectID 任何帮助都将不胜感激。多谢各位 逆插入法: Meteor.methods({ updateOrder: f

我需要使用upsert,因为我的帐户模式(见下文)中的某个记录可能不存在。其存在的决定性因素是时间和时间。如果存在与这两项匹配的记录,则只需更新该记录

但是,当我运行此程序时,我得到以下错误:已清理并报告给客户端:Adviser id必须是一个对象[400]。当我在updateOrder方法中console.log(advisor)时,它确实正确地报告了advisor ObjectID

任何帮助都将不胜感激。多谢各位

逆插入法:

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"
  }
});

很可能你想让它成为一根弦。MongoDB内部ID对象是Meteor中的字符串。

您很可能希望Advisorid成为字符串。MongoDB内部ID对象是Meteor中的字符串。

这就是我们在Meteor中插入的方式

 Shares.update({
                 adviserId: adviser,
                 period: period
              }, {
                 $set: {
                    adviserId: adviser,
                    order: order,
                    outstanding: order,
                    period: period
                 }
              }, {
                  upsert: true
              })

这就是我们在《流星》中的表现

 Shares.update({
                 adviserId: adviser,
                 period: period
              }, {
                 $set: {
                    adviserId: adviser,
                    order: order,
                    outstanding: order,
                    period: period
                 }
              }, {
                  upsert: true
              })

从SimpleSchema文档:

如果您有一个类型为Object的键,那么对象的属性也将被验证,因此您必须在模式中定义所有允许的属性


方法中的
advisor
应该是字符串,因为您使用它进行查找(在upsert中)。如果您的
advisor
是一个字符串,那么只需修复
{type:string,regEx:SimpleSchema.regEx.Id}
的模式即可。或者,如果要使用对象,则需要对其进行描述或添加。

来自SimpleSchema文档:

如果您有一个类型为Object的键,那么对象的属性也将被验证,因此您必须在模式中定义所有允许的属性


方法中的
advisor
应该是字符串,因为您使用它进行查找(在upsert中)。如果您的
advisor
是一个字符串,那么只需修复
{type:string,regEx:SimpleSchema.regEx.Id}
的模式即可。或者,如果你想使用一个对象,那么你需要描述它或添加它。

谢谢你Bryukhanov Valentin。转换为字符串类型解决了我的问题


也感谢那些回复的人。

谢谢布吕哈诺夫·瓦伦丁。转换为字符串类型解决了我的问题


也要感谢那些回复的人。

嗨,像这样包装顾问的字符串(顾问)不起作用。有什么想法吗?顾问是根据控制台M…D.ObjectID{u str:“56c7344d685029e7aa325f7b”}这是否等于您想要的顾问Id?嗨,像这样包装顾问字符串(顾问)不起作用。有什么想法吗?adviser是根据console M…D.ObjectID{u str:“56c7344d685029e7aa325f7b”}这是否等于您想要的adviser Id?谢谢,但这仍然不起作用:updateOrder:function(adviser,order,period){console.log(adviser);Account.update({adviserId:String(adviser),period:period,},{$set:{advisionrid:String(advisor),order:order,未决:order,period:period},{upsert:true};}如果你能和我共享最小的代码,那就太好了,我会看看。我没有从JSFIDLE得到任何东西。你可以在github上用最小的代码共享它。谢谢,但这仍然不起作用:updateOrder:function(adviser,order,period){console.log(adviser);Account.update({adviserId:String(adviser),period:period,},{$set:{advisionrid:String(advisor),order:order,未决:order,period:period},{upsert:true};}如果你能和我共享最小的代码就太好了,我会看看。我没有从JSFIDLE得到任何东西。你可以在github上用最小的代码共享它。方法中的“顾问”是什么?是id(字符串)还是某个对象?方法中的“顾问”是什么?是id(字符串)吗或者某个对象?您好,我认为您的思路是正确的。不幸的是,仅仅黑盒对象似乎不会停止任何验证,所以总是说Advisorid应该是一个对象。@User149693如果“blackbox”没有帮助,那么它就不是一个对象。我认为它是一个字符串,尝试使用“type:string”Hi。当我控制台..log(Advisor)时哪个应该是来自此的adviserId。它返回ObjectID(“56cdc8be14c6ddae95becfdd”)。我在adviserId架构上使用了blackbox,但它仍然拒绝它,说adviserId必须是一个对象。有点难懂。@User149693您能展示一下如何在方法中发送数据(调用它)吗。因为在我的例子中类似的例子,我得到了类似于
Fs2SRhd2eAfrQyvDE
Hi的东西,我认为你的思路是正确的。不幸的是,只是对对象进行黑箱操作似乎不会停止任何验证,所以总是说adviserId应该是一个对象。@user149693如果“blackbox”没有帮助,那么这不是一个对象。我认为它是一个字符串,请尝试使用“type:string”Hi。当我控制台..log(adviser)时,它应该是来自此的adviserId。它返回ObjectID(“56cdc8be14c6ddae95becfdd”)。我在adviserId架构上使用了blackbox,但它仍然拒绝它,说adviserId必须是一个对象。这有点让人难堪。@user149693您可以演示如何在该方法中发送数据(调用它)。因为在我的例子中,我得到了类似于
Fs2SRhd2eAfrQyvDE