为了能够比较文档的保存前和保存后版本,我试图在pre
钩子中查找文档,然后使用它来查看文档中文档的更改。 post
保存钩子。
但是由于某种原因,我收到“ Customer.findOne()不是函数”错误。这对我来说没有任何意义,因为我已将模型导入此触发器文件,然后在我的函数中执行以下操作:
const Customer = require("../customer");
// Get a version of the document prior to changes
exports.preSave = async function(doc) {
console.log("preSave firing with doc._id", doc._id); // this ObjectId logs correctly
if (!doc) return;
this.preSaveDoc = await Customer.findOne({ _id: doc._id }).exec();
console.log("this.preSaveDoc: ", this.preSaveDoc);
};
同样,此代码会产生错误:
“ Customer.findOne()不是函数”
仅供参考,我的Customer
模型中的相关代码如下:
let Schema = mongoose
.Schema(CustomerSchema, {
timestamps: true
})
.pre("count", function(next) {
next();
})
.pre("save", function(next) {
const doc = this;
trigger.preSave(doc);
next();
})
.post("save", function(doc) {
trigger.postSave(doc);
})
.post("update", function(doc) {
trigger.postSave(doc);
})
.post("findOneAndUpdate", function(doc) {
trigger.postSave(doc);
});
module.exports = mongoose.model("Customer", Schema);
我在这里想念什么?为什么这段代码会在非常标准的MongoDB操作上产生此错误?
答案 0 :(得分:1)
此问题已解决。
如果mongoDb版本为3.6或更高,则可以使用change streams
更改流可让您知道文档中发生了什么更改。在mongoDb中运行一个后台进程,该进程会通知您的代码一个事件(创建,更新,删除)发生并向您传递文档。您可以过滤字段以了解确切的值。
您可以参考此blog
这是一个经典的用例,可以应用更改流。比重新发明轮子更好:)
答案 1 :(得分:0)
这是使它起作用的方法。而不是像这样通过Mongoose查找文档的预先保存/预先转换的版本:
// Get a version of the document prior to changes
exports.preSave = async function(doc) {
console.log("preSave firing with doc._id", doc._id); // this ObjectId logs correctly
if (!doc) return;
this.preSaveDoc = await Customer.findOne({ _id: doc._id }).exec();
console.log("this.preSaveDoc: ", this.preSaveDoc);
};
...以这种方式查找文档:
// Get a version of the document prior to changes
exports.preSave = async function(doc) {
let MongoClient = await require("../../config/database")();
let db = MongoClient.connection.db;
db.collection("customers")
.findOne({ _id: doc._id })
.then(doc => {
this.preSaveDoc = doc;
});
};