我正在Node上建立一个基本的博客.js/Express使用MongoDB和Mongoose ORM.

我有一个"保存"前的钩子,我想用它自动生成一个博客/ idea 片段.这很好用,除了我想在继续之前查询一下是否有其他帖子使用相同的slug.

然而,this似乎无法访问.找到或者.findOne(),所以我一直收到一个错误.

最好的方法是什么?

  IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
      return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this has no method 'find'
    this.findOne({slug: idea.slug}, function(err, doc) {
      console.log(err);
      console.log(doc);
    });

    //console.log(idea);
    next();
  });

推荐答案

不幸的是,它没有很好的文档记录(在Document.js API docs中没有提到),但是文档可以通过constructor字段访问它们的模型——我一直使用它来记录插件中的内容,这让我可以访问它们所连接的模型.

module.exports = function readonly(schema, options) {
    schema.pre('save', function(next) {
        console.log(this.constructor.modelName + " is running the pre-save hook.");

        // some other code here ...

        next();
    });
});

对于你的情况,你应该能够做到:

IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
        return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this now works
    this.constructor.findOne({slug: idea.slug}, function(err, doc) {
        console.log(err);
        console.log(doc);
        next(err, doc);
    });

    //console.log(idea);
});

Mongodb相关问答推荐

基于另一子文档更改子文档的引用

为什么AllowDiskUse不能在$GROUP阶段的聚合管道中工作?

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

MongoDB中的字符串聚合

spring-data-mongodb 上的 TopN 聚合

MongoDB 查询以包含多个字段的最常见值的计数

在亚马逊 EC2 上托管 nodeJS/mongoose Web 应用程序

System.FormatException occurred in MongoDB.Bson.dll - XXX is not a valid 24 digit hex string

MongoDB查询仅返回嵌入文档

Meteor 方法与deny/allow 规则

删除嵌套文档数组中的嵌入文档

无法将 $match 运算符用于带有 ObjectId 的 mongodb/mongoose 聚合

如何在 mongo JavaScript shell 中中止查询

RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要什么 inverse_of ?

如何在 MongoDB 的 $match 中使用聚合运算符(例如 $year 或 $dayOfMonth)?

MongoError: The dollar ($) prefixed field '$push' in '$push' is not valid for storage

MongoDB如何判断是否存在

使用自定义 _id 值时 mongodb 中的 Upserts

无法连接到远程服务器上的 mongo

Mongodb $lookup 使用 _id 无效果