mongoose – encryption和更新对象

我知道mongooseencryption文件说:

更新将在未encryption和未经身份validation的字段上正常工作,但如果涉及encryption或身份validation字段,将无法正常工作。

而且我观察到,当我使用mongoose创build方法时,我的字段被encryption到_ct字段中。 但是,如果我然后使用findByIdAndUpdate更新我的对象,我看到的字段是以纯文本(作为通过find命令从mongodb控制台输出)创build。

从保存

> db.tenants.find().pretty() { "_id" : ObjectId("554b7f8e7806c204e0c7589e"), "_ac" : BinData(0,"YdJjOUJhzDWuDE5oBU4SH33O4qM2hbotQTsF6NzDnx4hWyJfaWQiLCJfY3QiXQ=="), "_ct" : BinData(0,"YaU4z/UY3djGCKBcgMaNIFHeNp8NJ9Woyh9ahff0hRas4WD80V80JE2B8tRLUs0Qd9B7IIzHsq6O4pYub5VKJ1PIQA+/dbStZpOH/KfvPoDC6DzR5JdoAu+feU7HyFnFCMY81RZeJF5BKJylhY1+mG4="), "__v" : 0 } 

findByIdAndUpdate之后

 > db.tenants.find().pretty() { "_id" : ObjectId("554b7f8e7806c204e0c7589e"), "_ac" : BinData(0,"YdJjOUJhzDWuDE5oBU4SH33O4qM2hbotQTsF6NzDnx4hWyJfaWQiLCJfY3QiXQ=="), "_ct" : BinData(0,"YaU4z/UY3djGCKBcgMaNIFHeNp8NJ9Woyh9ahff0hRas4WD80V80JE2B8tRLUs0Qd9B7IIzHsq6O4pYub5VKJ1PIQA+/dbStZpOH/KfvPoDC6DzR5JdoAu+feU7HyFnFCMY81RZeJF5BKJylhY1+mG4="), "__v" : 0, "userId" : ObjectId("55268f43cbfc87be221cd611"), "social" : "123-45-6789", "last" : "bar", "first" : "foo" } 

有更新对象和使用mongooseencryption来维护encryption的推荐策略吗?

正如你所引用的,mongooseencryption的文档清楚地表明它不能用于更新。

https://github.com/joegoldbeck/mongoose-encryption

mongoose更新钩子也有点棘手。

你可以做的就是模拟你的集合,使得需要被encryption的字段完全是一个单独的集合,并且在paren集合中通过id链接它们。

 Person = { _id: <ObjectId> name: Blah .. .. documents: [ { 'doc_id': <ObjectId1> }, { 'doc_id': <ObjectId2> }, ] } Documents = [ { "_id" : <ObjectId1>, "_ac" : BinData(0,"YdJjOUJhzDWuDE5oBU4SH33O4qM2hbotQTsF6NzDnx4hWyJfaWQiLCJfY3QiXQ=="), "_ct" : BinData(0,"YaU4z/UY3djGCKBcgMaNIFHeNp8NJ9Woyh9ahff0hRas4WD80V80JE2B8tRLUs0Qd9B7IIzHsq6O4pYub5VKJ1PIQA+/dbStZpOH/KfvPoDC6DzR5JdoAu+feU7HyFnFCMY81RZeJF5BKJylhY1+mG4="), "__v" : 0 } ... ... ] 

这也会增加代码重用。