使用 Mongoose 和 Lodash

在大多数情况下,Mongoose 与 Lodash 兼容良好。但是,您需要注意一些注意事项。

cloneDeep()

您不应该在任何 Mongoose 对象上使用 Lodash 的 cloneDeep() 函数。这包括 连接模型类查询,但对 文档 尤其重要。例如,您可能会想尝试以下操作

const _ = require('lodash');

const doc = await MyModel.findOne();

const newDoc = _.cloneDeep(doc);
newDoc.myProperty = 'test';
await newDoc.save();

但是,如果 MyModel 具有任何数组属性,则上面的代码将抛出以下错误。

TypeError: this.__parentArray.$path is not a function

这是因为 Lodash 的 cloneDeep() 函数不会 处理代理,而 从 Mongoose 6 开始,Mongoose 数组是代理。通常您不需要深度克隆 Mongoose 文档,但是,如果您必须这样做,请使用以下方法替代 cloneDeep()

const doc = await MyModel.findOne();

const newDoc = new MyModel().init(doc.toObject());
newDoc.myProperty = 'test';
await newDoc.save();