Meteor方法不会使用call / methods更新

时间:2017-01-21 20:09:39

标签: mongodb meteor

使用以下代码时无法获取要更新的文档:

client.js

// Update the story
Meteor.call('storyEdit', FlowRouter.getParam("_id"), story, function(result){

  // put stuff here

});

server.js

Meteor.methods({
  'storyEdit': function( id, doc ){

    // console.log(doc);

    // Update the user
    Stories.update(id,{$set:doc},function(error){
      if (error) {
          throw new Meteor.Error(500, error.message);
      } else {
          console.log("Update Successful");
      }
    // response
    });

  // settings
  }
});

文档中有很多嵌套元素。四个最顶层的节点。所以喜欢:

{  
   title:'.',
   genre:'...',
   author:'...',
   description:'...',
   image:'...',
   audio:{  
      intro:'',
      background:'...',
      outro:'...'
   },
   credits:[  
      {  
         'Story by ':'...'
      },
      {  
         'Music by ':'...'
      },
      {  
         'Illustrations by ':'...'
      }
   ],
   chapters:[  
      {  
         title:'Chapter One',
         pages:'[Object]',
         audio:{  

         }
      },
      {  
         title:'Chapter Two',
         pages:'[Object]',
         audio:{  

         }
      },
      {  
         title:'Chapter Three',
         pages:'[Object]',
         audio:{  

         }
      },
      {  
         title:'Chapter Four',
         pages:'[Object]',
         audio:{  

         }
      },
      {  
         title:'Chapter Five',
         pages:'[Object]',
         audio:{  

         }
      },
      {  
         title:'Chapter Six',
         pages:'[Object]',
         audio:{  

         }
      }
   ],
   published:false
}

以上我手动序列化了,所以可能会出错

从终端开始,他们输出为[object],但我只是认为这是节省终端空间的预期行为。这可能是问题吗?我希望我可以更新无限子节点(到一点)。

日志输出更新成功。什么都没有改变。终端看起来也很好。

有什么想法吗?

修改

这可能是向后工作,我无法让这个更新更新甚至最基本的东西,比如标题。这是一个例子:

export const Stories = new Mongo.Collection('stories');

if (Meteor.isServer) {
  // This code only runs on the server
  Meteor.publish('stories', function(){
    return Stories.find();
  });

}

Meteor.methods({
  'storyEdit': function( id, doc ){

    // Update the document
    Stories.update({id:'58772299f8a253cabcbc625a'},{$set:{title:"123"}},function(error,result){
      console.log(error,result);
      if (error) {
          throw new Meteor.Error(500, error.message);
      } else {
          console.log("Update Successful");
      }
    // response
    });

  // storyEdit
  }
});

然后从终端,只需做一个简单的查找,看看是否有任何更新:

db.stories.find({"_id" : ObjectId("58772299f8a253cabcbc625a")},{title:1});

标题永远不会改变。我在这里错过了什么?在编辑阶段可能是权限吗?结果我得到0。所以这就像两个ID完全不同。

3 个答案:

答案 0 :(得分:0)

这是使用set:

更新mongo文档的方法
    Stories.update({_id:'your id'},{$set:{'chapter':yourDoc}},function(error,result){
        if(error){
            throw new Meteor.Error(500, error.message);
        }
        else {
            console.log('success')
        }
   })

检查set addToSet和push之间的一些区别,这可能会有所帮助。

答案 1 :(得分:0)

没有更新,因为您使用了错误的_id值,我发现您使用此_id来匹配您的代码中的文档:58772299f8a253cabcbc625a,但是在终端中您是使用另一个值ObjectId("58772299f8a253cabcbc625a")。这是两个不同的值,这就是您无法更新文档的原因。

要将字符串转换为Mongo ObjectId,您可以使用此函数:

const _id = new Mongo.ObjectID('58772299f8a253cabcbc625a');

答案 2 :(得分:0)

您几乎所有事情都做得恰到好处,如果您将ID存储为ObjectId,则需要查找_id而不是id。这应该可以解决你的问题

export const Stories = new Mongo.Collection('stories');

if (Meteor.isServer) {
  // This code only runs on the server
  Meteor.publish('stories', function(){
    return Stories.find();
  });
}

Meteor.methods({
  'storyEdit': function( id, doc ){
    const _id = new Meteor.Collection.ObjectID('58772299f8a253cabcbc625a')
    // Update the document
    Stories.update({ _id }, { $set: { title: '123' } }, function (error,result) {
      console.log(error, result);
      if (error) {
        throw new Meteor.Error(500, error.message);
      } else {
        console.log("Update Successful");
      }
    // response
    });
  // storyEdit
  }
});