node.js - Mongoose 总是插入第一个文档并跳过预保存 Hook

标签 node.js mongodb mongoose

代码检查数据库中是否存在文档(使用预保存 Hook ),如果不存在则将其插入。它工作正常,但不适用于第一个文档。它总是被插入。似乎第一个文档没有触发预保存 Hook 。

Model = require('./model')
var model = new Model();

//Before saving, check if the product exists
Model.schema.pre('save', function (next) {
    var self = this;
    Model.findOne({apiProductId: self.apiProductId}, function (err, product) {
        if (!product) {
            next();
        }
        else {
            next(new Error("Product exists: " + self.apiProductId));
        }
    });
 });

model.save(function (err, document) {
    if (err) {
        console.log(err);
    }
        else {
            console.log('Inserted: ' + document.apiProductId);
        }
});

最佳答案

预保存钩子(Hook)不是避免重复的正确方法。您应该使用 findOneAndUpdate

您的问题可能是:

  1. 您正在尝试异步保存多个文档: Hook 执行顺序不可预测
  2. 您已经在 apiProductId 上创建了一个稀疏索引,并且正在检查一个 null 值。

关于node.js - Mongoose 总是插入第一个文档并跳过预保存 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37784357/

相关文章:

javascript - Mongoose 中的 runCommand 相当于什么?

node.js - Ember 和 Express : let Ember handle routes instead of Express?

javascript - 直接在 MongoDB 中引用 ObjectID 可以,但在 Mongoose 中不行

python - 如何检查 pymongo 游标是否有查询结果

java - 我们如何在 Mongo 中使用 ClusterListener?

javascript - Expressjs Mongoose 查找嵌套嵌入文档未定义

javascript - 如何执行使用 AND 和 OR 的条件 Mongoose 查询?

javascript - Node js,使用带有 Q Promise 的 mongoose 不会调用拒绝函数

Javascript、 Node 、Q promises、原型(prototype)函数和 "this"

node.js - 将流写入 gridfs-stream