Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 序列化然后反序列化mongoose.Model实例_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Node.js 序列化然后反序列化mongoose.Model实例,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的问题是: 我有一个系统,它有两台主机:机器M1和机器M2,每台主机在同一个代码库上运行一个node.js进程。 在M1上,我有一个mongoose.Model实例用户,我需要使用RESTAPI调用将其传递给M2。我必须有M2上的用户的完整实例,即所有数据,虚拟,插件,保存应按预期工作。 一种解决方案是只发送用户的ObjectId,然后在M2上执行对mongodb的查询以获取完整的对象。我不想这么做! 另一种解决方案是使用user.toJSON或user.toObject对其进行序列化,然后将

我的问题是:

我有一个系统,它有两台主机:机器M1和机器M2,每台主机在同一个代码库上运行一个node.js进程。 在M1上,我有一个mongoose.Model实例用户,我需要使用RESTAPI调用将其传递给M2。我必须有M2上的用户的完整实例,即所有数据,虚拟,插件,保存应按预期工作。 一种解决方案是只发送用户的ObjectId,然后在M2上执行对mongodb的查询以获取完整的对象。我不想这么做! 另一种解决方案是使用user.toJSON或user.toObject对其进行序列化,然后将其发送到网络上。在M2上,我所做的就是新建UserObject。 问题是,在此调用.save时,它会将其解释为新对象,并尝试插入而不是.update。 为了解决这个问题,我可以在对象上设置.isNew=false,但是,当更新时,存储模型和更新值之间的增量差现在包含所有数据,mongo抱怨它不会更新文档的_id
有没有一种优雅的方法可以使用本机方法或插件来解决这个问题?!我做错了吗

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

如果您计划通常使用它,那么最终可能会在模式中定义一个新的静态方法,如:

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

通过这种方式,您可以将用户数据传递到M2,在M2上,您可以轻松地进行更新。

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

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


因此,在M2上,可以使用User.hydarateuserObject代替new UserObject,并且无需将isNew设置为false。

您是正确的,这是一个解决方案,事实上我现在正在这样做,但我正在寻找一个更惯用的解决方案,即由mongoose.Model.save方法处理更新。这只是品味的问题。10倍