如何在 Mongoose 中编写一个获取所有文档的静态方法?

Posted

技术标签:

【中文标题】如何在 Mongoose 中编写一个获取所有文档的静态方法?【英文标题】:How to write a static method in Mongoose that gets all documents? 【发布时间】:2019-05-16 05:26:46 【问题描述】:

我是 Mongoose 的新手。我为名为“questionSchema”的 Mongoose 模式编写了一个静态方法和一个实例方法,并将其导出如下:

var questionSchema = new Schema(
    ...
)

questionSchema.methods.createQuestion = function()
    return this.save(function(err)
        if(err) 
            return  err
        ;
        return 'Saved the question';
    );
;

questionSchema.statics.getAllQ = function()
    return this.find(, function(err, res)
        if(err) 
            return  err
        ;
        return res;
    );


module.exports = mongoose.model('Question', questionSchema)

然后在我的 Node/Express 服务器的一个路由中,我将它作为模型导入,并尝试调用静态方法,该方法应该返回 Question 模型下的所有文档:

const Question = require('../models/question.js');

...

router.post('/qcrud/submit', (req, res) => 
    let reqBody = req.body;

    var newQuestion = new Question(reqBody);    
    newQuestion.createQuestion();
)

router.get('/qcrud/getAll',(req, res) => 
    let qArr = Question.getAllQ()
    res.send(qArr);
);

但是,它返回一个 Query 对象,而不是我预期的数组。我环顾四周,在 MDN 上看到了

'如果你不指定回调,那么 API 将返回一个变量 查询类型。'

我确实指定了一个回调,但仍然得到了 Query 对象。首先,我使用的是静态方法和实例方法吗?文件甚至保存了吗?以及如何访问保存的数组文档?

【问题讨论】:

【参考方案1】:

如果您使用的是 Node 8.x,您可以使用 async/await

这样你的代码看起来会更加同步:

questionSchema.statics.getAllQ = async () => 
    return await this.find();


router.get('/qcrud/getAll',async (req, res) => 
    let qArr = await Question.getAllQ();
    res.send(qArr);
);

您可以找到一篇非常好的文章,它解释了如何将 Mongoose 与 async/await here 一起使用。

【讨论】:

如果这为我返回了一个空数组 [ ],这是否意味着我的文档尚未保存?我还需要使用 async await 来保存吗? 这意味着您的保存方法无法正常工作,因为数据库中没有任何内容。您可能应该尝试检查该方法。在我包含在答案中的链接上,您有示例如何将 await/async 与 save 一起使用 但它明确写成here 不使用 ES6 箭头函数声明静态:“不要使用 ES6 箭头函数 (=>) 声明静态。箭头函数明确阻止绑定 this,所以上面的示例将因为这个的价值而不能工作。”

以上是关于如何在 Mongoose 中编写一个获取所有文档的静态方法?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 查询以获取文档的所有子文档

Mongoose 参考文档的 TTL 过期

使用 Mongoose 查询嵌套的嵌入文档

无法从 Mongoose 模型中获取文档“find”承诺

如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?

如何使用 Mongoose 返回所有子文档