2015-04-11 2 views
3

Я работаю над приложением Meteor, и одна из функций, которые я создаю, представляет собой форму, которая вставляет новый документ в массив (вставляет адрес доставки в профиль пользователя, где пользователь может иметь несколько адресов). Ошибка я получаю это:Что такое модификаторы и операторы MongoDB?

Exception while invoking method 'addAddress' Error: When the modifier option is true, validation object must have at least one operator 

Я безуспешно пытался выяснить ответ на Stackoverflow, Github и т.д., но не смог найти решение. Теперь я хочу понять, что именно означает ошибка - так что мой вопрос в том, какие именно варианты модификатора и операторы в MongoDB? Из того, что я понимаю, модификаторы предоставляют ограничения на то, какой тип данных возвращается из запроса, а операторы используются для изменения данных. Правильны ли эти определения?

Кто-нибудь знает, какая ошибка, которую я получаю, может означать? Вот мой пример кода:

Мое событие щелчка, чтобы захватить данные по форме и вызвать метод, чтобы добавить адрес:

Template.editAddress.events({ 

'click .addAddress': function(e, tmpl) { 
e.preventDefault(); 
var currentUserId = Meteor.userId(); 
console.log(currentUserId); 
var addressDetails = { 
    address: { 
    streetAddress: $('#streetAddress').val() 
    } 
}; 
console.log(addressDetails); 
Meteor.call('addAddress', addressDetails, currentUserId, function(error) { 
    if (error) { 
    alert(error.reason); 
    } else { 
    console.log('success!'); 
    Router.go('Admin'); 
    } 
}); 

} });

Мой метод, чтобы вставить адрес:

Meteor.methods({ 
'addAddress': function(addressDetails, currUserId) { 

    var currentUserId = currUserId; 

    console.log('user to add address to is ' + currUserId); 

    Meteor.users.update(currentUserId, {$addToSet: 
     { 
      'address.streetAddress': addressDetails.streetAddress 
     } 
     }); 
    } 

});

Обратите внимание, что при вводе этого запроса в консоли, она работает:

db.users.update({_id: 'Qdf89k3fd93jfdk'}, {$addToSet: {'address.streetAddress': '12345 fake st'}}); 

Спасибо заранее!

+0

Вы можете разместить свои выборочные данные и что запрос вы пробовали? – Yogesh

+0

уверен, только что добавил –

ответ

2

Ваш addressDetails объект не имеет поля streetAddressaddressDetails.streetAddress, поэтому возвращается undefined. Используйте вместо этого addressDetails.address.streetAddress в обновлении. А также, как указал Джошуа, используйте объект как селектор с { _id: currUserId }. Таким образом, вся функция должна быть:

Meteor.users.update({ _id: currentUserId }, {$addToSet: 
    { 
     'address.streetAddress': addressDetails.address.streetAddress 
    } 
    }); 
} 

Еще одна вещь: вы не должны передавать userId с клиента. Любой метод, который вы определяете, может быть вызван от клиента и так, я мог бы вызвать ваш метод 'addAddress' из консоли браузера с любым userId, чтобы обновить их адрес. Вместо этого используйте this.userId объект в вызове метода (см here) и убедитесь, что это не null, т.е. пользователь вошел в систему.

if (! this.userId) 
    throw new Meteor.Error(401, "You must be logged in!"); 
var currentUserId = this.userId; 
1

Похоже, что вы передаете идентификатор документа непосредственно в метод запроса MongoDB, а не строите объект со свойством _id со значением указанного идентификатора документа.

попробовать т.е.

var currentUserId = { _id: currUserId }; 
+0

Это не обязательно для Meteor, методы коллекции явно принимают в качестве первого аргумента Mongo Selector, ObjectID или String. – Gigo