Mongoose - 修改后查找结果

问题描述 投票:0回答:4

我想在 `schema.post('find')' 中间件中修改结果,但这似乎是不可能的:

const PersonSchema = new mongoose.Schema({ name: String })

PersonSchema.post('find', function(result) {
    console.log('HOOW: Post Find', result)
    result.team("Real Madrid")
    return result

})

const Person = mongoose.model('Person', PersonSchema)

每当我尝试执行查找查询时,都会执行 console.log 语句,但是永远不会添加

team
字段。

如何将此字段添加到我的结果中?

注意:

我的真实代码有点复杂,我需要对数据库进行一些查询,并将这些结果添加到

find
查询的结果中。

mongodb mongoose middleware
4个回答
0
投票

你的问题在

result.team("Real Madrid")

改为

result.team="Real Madrid"

result['team']="Real Madrid"     (Quotes are required)

试试这个

PersonSchema.post('find', function(result) {
        console.log('HOOW: Post Find', result)
        result.team="Real Madrid"
        return result

    })

0
投票

要向查询返回的文档添加其他字段,您可以使用 lean():

Person.find({...}).lean();

因为

find()
方法的结果是一个数组所以你需要遍历它并为每个元素添加字段:

PersonSchema.post('find', function(result) {
  console.log('HOOW: Post Find', result)
  result.forEach(val => val.team="Real Madrid");
  return result
})

0
投票

你应该这样使用

PersonSchema.post('find', function(result) {

    result= result.toObject();

    console.log('HOOW: Post Find', result)
    result.team("Real Madrid")
    return result
})

0
投票

如果您使用

find
或其他就地数组修饰符等就地编辑数组,则可以在
post
挂钩中修改
Array.splice
的结果。但是,要重组结果本身(例如,将
results
数组转换为对象以便您可以添加顶级属性),您必须使用
ovewriteMiddlewareResult()
.

请参阅 Mongoose 的此 PR:https://github.com/Automattic/mongoose/pull/11927

另见

overwriteMiddlewareResult()
的文档:https://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-overwriteMiddlewareResult

如果你需要在结果中添加顶级属性,你需要先将其转换为对象,然后在返回时使用

overwriteMiddlewareResult()
::

PersonSchema.post('find', function(result) {
    result = { team: 'Madrid', result };
    return mongoose.overwriteMiddlewareResult(result);
})

但是如果您可以将

team
属性添加到每个单独的结果(每个数组元素),那么类似于以前的解决方案将通过就地编辑数组来工作:

PersonSchema.post('find', function(result) {
    result.forEach(elem => elem.team = 'Madrid');
})

希望这有助于解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.