MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合
Posted
技术标签:
【中文标题】MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合【英文标题】:MongoDB Aggregation - query collections that satisfies all array of objects not at least one 【发布时间】:2022-01-18 22:17:22 【问题描述】:我的集合在数组中包含日期,例如:
datesArray: [
start_date: Date,
end_date: Date
]
我只想要那些满足 datesArray 的所有元素的集合。
我在聚合 $match 运算符中使用它,例如:
Model.aggregate([
$match:
'datesArray.start_date': $gte: new Date('11-01-21') ,
'datesArray.end_date': $lte: new Date('11-30-21')
])
我尝试使用 $elemMatch,但它至少匹配一个数组元素。 我也用 $elemMatch 尝试了 $all,但没有成功。
谢谢
【问题讨论】:
试试这样 "$gte" : ISODate("2021-01-11T00:00:00Z"), 【参考方案1】:$map
您的 datesArray
根据您的日期范围匹配条件转换为布尔数组。对结果执行$allElementsTrue
以获得您想要的结果。
inputDate1
和 inputDate2
是您的输入。随时更新它们。
db.collection.aggregate([
"$addFields":
"inputDate1": ISODate("2021-01-01"),
"inputDate2": ISODate("2021-12-31")
,
"$match":
$expr:
"$allElementsTrue": [
"$map":
"input": "$datesArray",
"as": "d",
"in":
$and: [
$gte: [
"$$d.start_date",
"$inputDate1"
]
,
$lte: [
"$$d.end_date",
"$inputDate2"
]
]
]
])
这是Mongo playground 供您参考。
【讨论】:
成功了。谢谢!【参考方案2】:您可以简单地反转每个标准并使用$nor
:
db.collection.aggregate([
$match:
$nor: [
"datesArray.start_date": $lt: ISODate("2021-11-01"),
"datesArray.end_date": $gt: ISODate("2021-11-30")
]
])
【讨论】:
以上是关于MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合的主要内容,如果未能解决你的问题,请参考以下文章