Метеор апсерт с монго

Мне нужно использовать upsert, потому что какая-то запись в моей схеме учетных записей (см. ниже) может не существовать. Определяющими факторами для его существования являются советник ID и период. Если запись, которая соответствует обоим из них, существует, она должна просто обновить запись.

Однако, когда я запускаю это, я получаю эту ошибку: Санитизировано и сообщается клиенту как: Идентификатор советника должен быть объектом [400]. Когда я использую console.log(adviser) внутри метода updateOrder, он действительно правильно сообщает 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"
  }
});

person user1496093    schedule 23.02.2016    source источник
comment
Что такое советник в методе? Это идентификатор (строка) или какой-то объект?   -  person Valentin Briukhanov    schedule 23.02.2016


Ответы (4)


Из документов SimpleSchema:

Если у вас есть ключ с типом объекта, свойства объекта также будут проверены, поэтому вы должны определить все разрешенные свойства в схеме.

adviser в вашем методе должна быть строкой, потому что вы используете ее для поиска (в upsert). Если ваш adviser является строкой, просто исправьте схему для {type: String, regEx: SimpleSchema.RegEx.Id}. Или, если вы хотите использовать объект, вам нужно описать его или добавить опцию черного ящика.

person Valentin Briukhanov    schedule 23.02.2016
comment
Привет, я думаю, ты определенно на правильном пути. К сожалению, простое занесение объекта в черный ящик, по-видимому, не останавливает проверку, поэтому всегда говорится, что AdvisorId должен быть объектом. - person user1496093; 23.02.2016
comment
@user1496093 user1496093, если черный ящик не помогает, то это не объект. Я думаю, что это строка, попробуйте использовать тип: String - person Valentin Briukhanov; 23.02.2016
comment
Привет. Когда я console..log(adviser), который должен быть советником, исходящим из this._id, он возвращает ObjectID(56cdc8be14c6ddae95becfdd). Я использовал черный ящик в схеме AdviserId, и он все еще отклоняет ее, говоря, что AdviserId должен быть объектом. Типа запутался. - person user1496093; 25.02.2016
comment
@user1496093 user1496093 Не могли бы вы показать, как вы отправляете данные в методе (вызываете его). Потому что для аналогичного примера в моем случае я получаю что-то вроде Fs2SRhd2eAfrQyvDE - person Valentin Briukhanov; 25.02.2016

Более чем вероятно, что вы хотите, чтобы советник был строкой. Объекты внутреннего идентификатора MongoDB представляют собой строки в Meteor.

person Stephen Woods    schedule 23.02.2016
comment
Привет советник по обертке вроде так String(советник) не сработал. Любые идеи? советник это согласно консоли M…D.ObjectID {_str: 56c7344d685029e7aa325f7b} - person user1496093; 23.02.2016
comment
Этот _str равен идентификатору советника, который вы хотите? - person Stephen Woods; 23.02.2016

Вот как мы поднимаемся в метеоре.

 Shares.update({
                 adviserId: adviser,
                 period: period
              }, {
                 $set: {
                    adviserId: adviser,
                    order: order,
                    outstanding: order,
                    period: period
                 }
              }, {
                  upsert: true
              })
person Pankaj Jatav    schedule 23.02.2016
comment
Спасибо, но это все еще не работает: updateOrder: function(adviser, order, period) { console.log(adviser); Account.update({advisorId: String(советник), период: период, }, {$set: {advisorId: строка(советник), заказ: заказ, выдающийся: заказ, период: период } }, {upsert: true}) ; } - person user1496093; 23.02.2016
comment
Будет здорово, если вы поделитесь со мной минимальным кодом, я посмотрю. - person Pankaj Jatav; 24.02.2016
comment
Я ничего не получил от jsfiddle. Вы можете поделиться им на github с минимальным кодом. - person Pankaj Jatav; 25.02.2016

Спасибо Брюханов Валентин. Преобразование в тип String решило мои проблемы.

Спасибо также ответившим.

person user1496093    schedule 26.02.2016