Обновление Meteor Mongo ($ set object; $ push array) - PullRequest
0 голосов
/ 04 мая 2018

Добрый день.

Мне трудно понять, почему мой монго не обновляется. Объекты и массивы не обновляются. Я пробовал много путей. Помимо приведенного ниже кода, я попытался иметь ключ уже в документе (но пустой, так массив будет keyName:{}, а также ключ, которого нет в документе). Я также попытался поместить ключи в кавычки и т. Д. Я взял консольный вывод обновления и вставил его в Robo3T и выполнил запрос, и он прекрасно обновляет документ.

Метеор 1.6
монго 3.2.15

Серверный код работает

  const dbQuery = {owner: uid.user_id, paymentToken: uid.paymtToken}
  exFile = {
    $set: {
      agreement_id: responseData.id,              // string
      selfUrl: responseData.links[0].href,          // string
      agreementDetails: responseData.agreement_details, // object
      membershipLevel: 'premium',                // string
      ppOwnerInfo: responseData.payer,            // object
    },
  };
  let subsReturn = MonthlySubs.update(dbQuery, exFile, {multi:false, upsert:false} );
  console.log('subsReturn: ', subsReturn); // outputs: 1

Это приведет к обновлению документа всем, кроме объектов. Я знаю, что exFile действителен:

  console.dir(exFile, {depth: null});

Результат:

{ '$set':
{ agreement_id: 'I-SW0AL8YJS',
      selfUrl: 'https://api.sandbox.paypal.com/v1/payments/billing-agreements/I-SW0AL',
      agreementDetails:
       { outstanding_balance: { value: '0.00' },
         cycles_remaining: '1',
         cycles_completed: '0',
         next_billing_date: '2018-05-05T10:00:00Z',
         final_payment_date: '1970-01-01T00:00:00Z',
         failed_payment_count: '0' },
      membershipLevel: 'premium',
      ppOwnerInfo:
       { payment_method: 'paypal',
         status: 'verified',
         payer_info:
          { email: 'paypal-buyer@tion.com',
            first_name: 'test',
            last_name: 'buyer',
            payer_id: '99CEFGB6L',
            shipping_address:
             { recipient_name: 'test buyer',
               line1: '1 Main St',
               city: 'San Jose',
               state: 'CA',
               postal_code: '95131',
               country_code: 'US' } } } } }

Также возникают проблемы с обновлением массива.

  let pushFile = {
    $push: {
      links: {href: responseData.links[0].href, rel: 'self', method: 'GET', }
    }
  };
  console.dir(pushFile, {depth: null});
  subsReturn = MonthlySubs.update(dbQuery, pushFile, {multi:false, upsert:false} );
  console.log('subsReturn: ', subsReturn); // outputs: 1

Вот содержимое pushFile из вывода консоли:

{'$ push': {ссылки: {href: 'https://api.sandbox.paypal.com/v1/payments/billing-agreements/I-S45A17AV', rel: 'self', Метод: 'GET'}}}

Это тоже хорошо работает в Robo3T.

Я использую simpl-schema:

[snip]
  selfUrl: {
    type: String,
    label: 'Link for details about subscription on Paypal.',
optional: true,
  },
  ppOwnerInfo: {
    type: Object,
    label: 'Subscriber name, address, etc. from Paypal. Populates after subscription executed. (payer)',
    optional: true,
  },
  links: {
    type: Array,
    label: 'Holds various Paypal endpoints. Optional because not all inserts/updates have these.',
    optional: true,
  },
[/snip]

1 Ответ

0 голосов
/ 08 мая 2018

В вашей схеме вам нужно установить blackbox: true для ppOwnerInfo. Вероятно также для agreementDetails см. документы

...