更新流星中的特定字段

时间:2018-05-04 20:12:02

标签: mongodb meteor

我想只更新名称字段,我的代码的问题是,如果我更新文档,所有mongo文档都会更新。

当我更新具体的文档时,我必须承认我是这个mongo的新手,所以任何帮助我都会感谢你。

客户端

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 :(得分:1)

在您的name.js文件中(在服务器上)您的mongo查询为空,因此当mongo查询您的数据库时,它会匹配所有文档/记录。

Name.update(query, changes, options)

这是mongo docs的格式。您需要具有唯一标识符。你的表单正在保存一个“名称”,这就是你传递给Meteor.method的内容,但是你并没有告诉方法谁更改了他们的名字。如果用户已登录,则您只需使用流量唯一ID 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

答案 1 :(得分:1)

我建议您对Meteor代码进行一些即兴创作。

  1. Atleast使用Title 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条记录时。当您希望根据肯定会返回超过1条记录的条件影响许多记录时,您可以使用{ multi: true }

  4. check(name, String)电话中使用Meteor.method,以确保您向服务器发送的内容符合进一步操作的条件。

  5. 当您知道没有开箱即用的实施并且变得简单时,请使用aldeed autoforms

    以下是用于提高可读性和符合标准的即兴代码

  6.   

    <强>客户端

    <强>更新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 });
    }
    });