обновить конкретное поле в метеоре - PullRequest
0 голосов
/ 04 мая 2018

Я хочу обновить только поле имени, проблема с кодом, который у меня есть, заключается в том, что если я обновляю документ, все документы на монго обновляются.

Когда я обновляю конкретный документ, я должен признать, что я новичок в этой монго, поэтому я благодарю вас за любую помощь.

Клиент

updatename.html

<template name="updatename">
        <form class="editor-container">

          <input class=“save” type="text" id="card" value=“{{name}}”>

          <button type="button" class=“save” id="save">save</button>

        </form>
</template>

updatename.js

Template.updatename.events({
  'click .save’: function (e, t) {
       e.preventDefault();

       FlowRouter.watchPathChange();
       var name = FlowRouter.current().params._id;

       var name = $('#card').val();


       Meteor.call('name.update',name);
       FlowRouter.go('/');
   }
});

Сервер

name.js

Meteor.methods({
  'name.update'( name) {

    Name.update({
        Name.update({},{ $set: { nam: name }},{multi:true})
    });
}
});

Ответы [ 2 ]

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

Я рекомендую несколько импровизаций над вашим Метеорным кодом.

  1. Использование по умолчанию заголовка Case / CamelCase для лучшей читаемости имени шаблона и Meteor Methods для другого разработчика.

  2. используйте submit .formClassName вместо click .save, также укажите имя параметра с искренностью, например function (event, template)

  3. Когда вы обновляете документ для зарегистрированного пользователя, а не другого пользователя, например, dmayo , упомянутый в коде, использует Name.update({_id: Meteor.userId()},{ $set: {nam: name}}), но нет смысла указывать { multi: true }, когда вы знаете, что при обновлении будет только 1 запись. Вы можете использовать { multi: true }, если хотите повлиять на многие записи, основываясь на критериях, которые определенно вернут более 1 записи.

  4. используйте check(name, String) в Meteor.method вызове, чтобы убедиться, что то, что вы отправляете на сервер, подходит для дальнейших операций.

  5. Используйте aldeed autoforms , когда вы знаете, что нет готовой реализации и будет просто.

    Ниже приведен импровизированный код для лучшей читаемости и соответствия стандартам

Клиент

обновление-name.html

<template name="UpdateName">

        <form class="editorContainerForm">
            <input type="text" id="card" value=“{{name}}”>
            <button type="submit">Save</button>
        </form>

</template>

ДОПОЛНЕНО name.js

Template.UpdateName.events({
  'submit .editorContainerForm’: function (event, template) {
       event.preventDefault();   

       FlowRouter.watchPathChange();
       var name = FlowRouter.current().params._id;
       var name = $('#card').val();

       Meteor.call('updateName',name, function(error, response){
        if(error){
            // Show some BERT ERROR message for better user experience
            // use "meteor add themeteorchef:bert" to add package
        } else {
            // Show some BERT SUCCESS message for better user experience
        });
       FlowRouter.go('/');
   }
});

Сервер

name.js

Meteor.methods({
  updateName( name ) {
    check(name, String);
    Name.update({ _id: Meteor.userId },{ $set: { name: name }});
    // Use below code only if you know there can be multiple records for same ID
    // Name.update({ _id: Meteor.userId },{ $set: { name: name }}, { multi: true });
}
});
0 голосов
/ 04 мая 2018

В вашем файле name.js (на сервере) ваш запрос монго пуст, поэтому, когда монго запрашивает вашу базу данных, он совпадает со всеми документами / записями.

Name.update(query, changes, options)

Это формат согласно документам Монго. Вам нужно иметь уникальный идентификатор. Ваша форма сохраняет «имя», и это то, что вы передаете в Meteor.method, но вы не говорите методу, кто меняет их имя. Если пользователь вошел в систему, то вы можете просто использовать уникальный идентификатор метеора Meteor.userId()

Name.update({_id: Meteor.userId()},{ $set: {nam: name}},{multi:true})

Кроме того, ваш параметр multi:true говорит об обновлении всех документов, соответствующих запросу. Если в вашем исходном методе, как написано, у вас было multi:false (по умолчанию), то был бы обновлен только один документ (но, вероятно, не тот, который вы хотели, поскольку первое совпадение было бы обновлено из-за пустого поля запроса.

Документы Mongo: https://docs.mongodb.com/manual/reference/method/db.collection.update/ Metor документы: https://docs.meteor.com/api/collections.html#Mongo-Collection-update

...