2016-02-23 10 views
0

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

Однако, когда я запускаю это, я получаю эту ошибку: Sanitized и сообщается клиенту как: ID советника должен быть объектом [400]. Когда я console.log (советник) внутри метода updateOrder, он действительно правильно сообщает идентификатор объекта-советника.

Любая помощь будет оценена по достоинству. Спасибо.

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

Что такое «советник» в методе? Это идентификатор (строка) или какой-либо объект? –

ответ

1

От SimpleSchema Docs:

If you have a key with type Object, the properties of the object will be validated as well, so you must define all allowed properties in the schema.

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

+0

Привет, я думаю, что вы определенно на правильном пути. К сожалению, просто blackboxing объекта, похоже, не останавливает проверку, поэтому всегда говорит, что adviserId должен быть объектом. – user1496093

+0

@ user1496093 если «черный ящик» не помогает, то это не объект. Я думаю, что это строка, попробуйте использовать «type: String» –

+0

Привет. Когда я console..log (советник), который должен быть adviserId, пришел из this._id, он возвращает ObjectID ("56cdc8be14c6ddae95becfdd"). Я использовал черный ящик на схеме adviserId, и он все еще отвергает его, говоря, что AdviserId должен быть объектом. Кинда вздрогнула. – user1496093

1

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

+0

Привет, советник по упаковке, как будто String (советник) не работает. Есть идеи? советник это в соответствии с консолью M ... D.ObjectID {_str: "56c7344d685029e7aa325f7b"} – user1496093

+0

Является ли это _str равным идентификатору консультанта, которого вы хотите? –

1

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

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

Спасибо, но это все еще не работает: updateOrder: function (советник, заказ, период) { console.log (советник); Account.update ( { adviserId: String (консультант), период: период, }, {$ набор: { adviserId: String (консультант), заказ: заказ, выдающаяся: заказ, период : период } }, {upsert: true}); } – user1496093

+0

Будет здорово, если вы сможете поделиться с нами минимальным кодом, я посмотрю на это. –

+0

https://jsfiddle.net/mishy111/7ypgdunq/ – user1496093

0

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

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