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.js getter 在 Find() 上膨胀子文档?
Mongoose find() 不适用于 $not 查询 [重复]