Nodejs mongoose能否在查询结果返回前,动态修改一些属性?

Nodejs mongoose能否在查询结果返回前,动态修改一些属性?

我用mongoose查询了10条数据,我想让这十条数据在返回之前,每条都自动添加一个属性,只能在返回后循环一次添加么? mongoose有没有内部的什么方法?

3 回复

当然可以。在 Mongoose 中,你可以在查询结果返回之前通过中间件或者自定义方法来动态修改查询结果中的每个文档。下面是一个简单的示例,展示了如何实现这一点。

示例代码

假设我们有一个名为 User 的 Mongoose 模型,并且我们希望在查询结果返回之前为每个用户文档添加一个新的属性 isSpecial

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义 User 模型
const userSchema = new Schema({
    name: String,
    email: String
});

// 在查询结果返回之前添加新属性
userSchema.post('find', function (docs) {
    docs.forEach(doc => {
        doc.isSpecial = true; // 动态添加属性
    });
});

const User = mongoose.model('User', userSchema);

// 使用模型进行查询
async function queryUsers() {
    const users = await User.find();
    console.log(users);
}

// 连接到 MongoDB 并运行查询
mongoose.connect('mongodb://localhost:27017/testdb', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => queryUsers())
    .catch(err => console.error(err));

解释

  1. 定义 Schema:

    • 我们定义了一个简单的 User 模型,包含 nameemail 字段。
  2. 使用中间件:

    • userSchema.post('find', ...) 是一个 Mongoose 中间件,它会在每次执行 find 查询之后运行。
    • 在这个中间件中,我们可以访问到查询结果的文档数组 docs,并对其进行修改。在这个例子中,我们给每个文档添加了一个新的布尔属性 isSpecial
  3. 查询数据:

    • queryUsers 函数中,我们使用 User.find() 来查询所有用户。由于我们在 userSchema 中设置了中间件,所以在查询结果返回之前,每个文档都会被自动添加 isSpecial 属性。

这种方法避免了在返回结果后单独遍历文档集合,使得代码更加简洁和高效。


使用 schema.virtual 解决了,谢谢关注~

在Mongoose中,你可以使用pre('find')pre('findOne')pre('findOneAndUpdate')等中间件,在查询结果返回之前对文档进行操作。这样你就不需要在返回结果后手动遍历并修改每个文档。

这里提供一个简单的示例代码,展示如何在查询结果返回之前动态地给每个文档添加一个属性:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 定义一个简单的Schema
const userSchema = new Schema({
    name: String,
    age: Number
});

// 在查询前中间件中修改文档
userSchema.pre('find', function() {
    this._conditions = this._conditions || {};
    // 此处可以添加你的逻辑来修改查询条件或文档
});

userSchema.pre('findOne', function() {
    // 同上,此中间件在findOne时触发
});

userSchema.post('find', function(results) {
    results.forEach(doc => {
        doc.someNewProp = 'someNewPropertyValue';
    });
});

userSchema.post('findOne', function(result) {
    if (result) {
        result.someNewProp = 'someNewPropertyValue';
    }
});

const User = mongoose.model('User', userSchema);

// 使用模型查询数据库
User.find()
    .then(users => console.log(users))
    .catch(err => console.error(err));

在这个例子中,我们定义了一个预中间件post('find')post('findOne'),它们会在查询结果返回之前被调用。你可以在这个中间件中修改返回的文档,例如向其中添加新的属性。

需要注意的是,Mongoose中间件(包括预中间件和后中间件)在执行查询后、结果返回之前触发,因此你可以在这些中间件中修改返回的数据,而不需要在返回之后再遍历结果集。

回到顶部