更新流星中的特定字段

update specific field in 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})
    });
}
});

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

Name.update(query, changes, options)

这是 mongo 文档中的格式。您需要有一个唯一的标识符。您的表单正在保存一个 "name",这就是您传递给 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

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

  1. 至少使用 Title Case/ CamelCase 以便其他开发人员更好地阅读模板名称和 Meteor Methods。

  2. submit .formClassName代替click .save,也用function (event, template)

  3. 诚意指定参数名
  4. 当您为登录用户而不是其他用户更新文档时,如代码中提到的 dmayo 使用 Name.update({_id: Meteor.userId()},{ $set: {nam: name}}),但没有任何意义当您知道更新时只有 1 条记录时指定 { multi: true }。当您希望根据肯定会 return 超过 1 条记录的条件影响许多记录时,您可以使用 { multi: true }

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

  6. 当您知道没有开箱即用的实现并且会很简单时,请使用 aldeed autoforms

    以下是为提高可读性和符合标准而临时编写的代码

Client

更新-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('/');
   }
});

Server

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 });
}
});