然后序列化然后反序列化mongoose.Model实例

时间:2014-07-10 08:17:53

标签: node.js mongodb mongoose

这是我的问题:

  • 我有一个带有两个主机的系统:机器M1和机器M2,每个主机在相同的代码库上运行node.js进程。
  • 在M1上我有一个mongoose.Model实例(用户),我需要将其传递给M2(使用REST api调用)。我必须在M2上拥有完整的用户实例,即。所有数据,虚拟,插件,save()都应按预期工作。
  • 一种解决方案是仅发送用户的ObjectId,然后在M2上执行对mongodb的查询以获取完整对象。我不想这样做!
  • 另一种解决方案是使用user.toJSON()user.toObject()对其进行序列化,然后将其发送到网络中。在M2上,我所做的只是new User(userObject)
  • 问题是,在此问候.save()时,它会将其解释为新对象并尝试insert()而不是.update()
  • 要解决此问题,我可以在对象上设置.isNew = false,但是,在更新时,delta(存储模型和更新值之间的差异)现在包含所有数据,并且mongo抱怨它不会更新文档&#39 ; s _id

有一种优雅的方法可以使用本机方法或插件来解决这个问题吗?我做错了吗?!

2 个答案:

答案 0 :(得分:0)

可能是错误的,但您可以尝试在创建的用户对象上使用upsert()而不是保存它。

如果您打算经常使用它,最终可能会在架构中定义一个新的静态方法,例如:

Schema.statics.createOrUpdate = function(object, callback) {
    statics.upsert(this, object, callback);
};

这样您就可以将用户数据传递给M2,而在M2上,您可以轻松更新。

答案 1 :(得分:0)

这是一个迟到的电话,但在找到Model.hydrate方法之前我遇到了同样的问题。

http://mongoosejs.com/docs/api.html#model_Model.hydrate

  

从预先保存的现有原始数据创建新文档的快捷方式   在DB中。返回的文档没有标记为已修改的路径   最初

因此可以使用M2 User.hydarate(userObject)代替new User(userObject),而无需将isNew设置为false。