为什么upsert添加多个文档而不是一个?

时间:2017-09-21 12:53:37

标签: mongodb meteor

我使用upsert更新mongodb中的文档(如果存在),如果不存在,则插入新文档。它工作正常,但每当我更新或插入时,它都会在数据库中保存多个文档。例如,如果我想通过将其值user_name添加为Ammy来更新一个名为user_name的字段,则会将A的一个文档保存为user_name,然后保存{{1} }}再次m,然后再次m,最后user_nameAmmy。一个条目共有4个单独的文档。有什么问题?

以下是代码: Main.js

  Router.route('/temp1/:ppid', function () {
  this.render('temp1', {
  data: function () {
  return Dbs.findOne({user_id:this.params.ppid});

  Router.go("/temp1",{},{user_id:this.params.ppid});
  }
  });
  });


   Template.temp1.events({
   'keyup .sub'(event)  {
   onst target= event.currentTarget;
   const user_id1 =target.user_id.value;
   const add =target.add.value;   
   const const = target.const.value;
   const path1 = target.path.value;
   const user_name1 =target.user_name.value;
   var p=Router.current().params.ppid;

    Meteor.call('dbs.update',p,user_id1, cont1, add1, 
    pth1,user_name1);

    }
    });

usermethod.js:

Meteor.methods({
 'dbs.updateuser'(p, user_id1, cont1, add1, pth1,user_name1) {
    Dbs.update({ user_id: p }, {
        $set: {
          user_id: user_id1,
          user_name:user_name1,
          cont: cont1,
          add: add1,
          pth: pth1
        }
      },
      { upsert: true }
      );
     }
     });

1 个答案:

答案 0 :(得分:2)

正如@Styx在评论中提到的那样,您使用变量puser_id1作为字段user_id的值。如果变量puser_id1 具有相同的值,您将能够执行您想要的操作,

三种解决方案:

  1. 请勿更改您的更新代码,但请确保puser_id1 具有相同的价值
  2. 更改您的更新代码,仅使用user_id1变量
  3. 更改您的更新代码,仅使用p变量
  4. 第二个解决方案的示例:

    Meteor.methods({
    'dbs.updateuser'(p, user_id1, cont1, add1, pth1,user_name1) {
        Dbs.update({ user_id: user_id1 }, // this value must be the same
        { 
          $set: {
                user_id: user_id1, // than this value, so it wont insert more documents
                user_name:user_name1,
                cont: cont1,
                add: add1,
                pth: pth1
          }
        },
        { upsert: true });
    }
    });
    

    编辑:第4个解决方案,只删除user_id标记中$set字段的行。

    Meteor.methods({
    'dbs.updateuser'(p, user_id1, cont1, add1, pth1,user_name1) {
        Dbs.update({ user_id: p },
        { 
          $set: {
                user_name:user_name1,
                cont: cont1,
                add: add1,
                pth: pth1
          }
        },
        { upsert: true });
    }
    });