Mongoose - 使用 find() 查询文档,其中嵌套数组值的总和在一定范围内

Posted

技术标签:

【中文标题】Mongoose - 使用 find() 查询文档,其中嵌套数组值的总和在一定范围内【英文标题】:Mongoose - query documents with find() where sum of nested array values is in certain range 【发布时间】:2021-01-06 10:43:29 【问题描述】:

我有一个集合的文档,如下所示:


   items: [
      
          price: 80
      ,
      
          price: 70
      
   ]
,

   items: [
      
          price: 100
      ,
      
          price: 85
      
   ]
,

   items: [
      
          price: 200
      ,
      
          price: 85
      
   ]
,
...

我希望能够使用MyObj.find(query) 查询所有文档,其中所有商品价格的总和在给定范围之间。例如,$gte 160 和 $lte 200 只会返回示例中的第二个文档。

const query = ???
const filteredDocs = await MyObj.find(query).exec()

对此的查询会是什么样子?

【问题讨论】:

【参考方案1】:

在这种情况下,您可以使用聚合。首先,用$addFields 和$sum 添加表示项目价格总和的字段,然后找到该字段与您的条件匹配的文档。比如:

MyObj.aggregate([
  
    $addFields: 
      total: 
        $sum: "$items.price"
      
    
  ,
  
    $match: 
      total: 
        $gte: 160,
        $lte: 200
      
    
  ,
])

Mongo Playground

编辑:如果你只想使用find(),你可以试试$expr:

MyObj.find(
  $expr: 
    $and: [
      
        $gte: [
          
            $sum: "$items.price"
          ,
          160
        ]
      ,
      
        $lte: [
          
            $sum: "$items.price"
          ,
          200
        ]
      
    ]
  
)

Mongo Playground

【讨论】:

这是否也可以通过 find() 而不是 aggreate() 来实现?我必须使用前者的方式受到限制。

以上是关于Mongoose - 使用 find() 查询文档,其中嵌套数组值的总和在一定范围内的主要内容,如果未能解决你的问题,请参考以下文章

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

Mongoose.js getter 在 Find() 上膨胀子文档?

mongo+mongoose+express

Mongoose find() 不适用于 $not 查询 [重复]

从 Mongoose Find() 查询向对象数组添加属性 [重复]

从 Mongoose Find() 查询向对象数组添加属性 [重复]