[英]How to find documents that their data match a condition on at least one item from a given array of items - mongoDB
我想获取提供的日期数组中存在的记录。
这个提供的日期数组将获取开始和结束日期之间的记录。
例子:
我有这个架构:
[
{
"_id": "1",
"course": "Maths",
"startDate": "2022-06-07",
"endDate": "2022-06-12"
},
{
"_id": "2",
"course": "Chemistry",
"startDate": "2022-06-06",
"endDate": "2022-06-09"
},
{
"_id": "3",
"course": "Physics",
"startDate": "2022-06-08",
"endDate": "2022-06-10"
},
{
"_id": "4",
"course": "Computer Science",
"startDate": "2022-06-10",
"endDate": "2022-06-18"
},
{
"_id": "5",
"course": "Computer Science",
"startDate": "2022-06-10",
"endDate": "2022-06-13"
},
{
"_id": "6",
"course": "Biology",
"startDate": "2022-06-08",
"endDate": "2022-06-10"
}
]
提供数组:
["2022-06-06", "2022-06-17"]
预期的响应是:
[
{
"_id": "2",
"course": "Chemistry",
"startDate": "2022-06-06",
"endDate": "2022-06-09"
},
{
"_id": "4",
"course": "Computer Science",
"startDate": "2022-06-10",
"endDate": "2022-06-18"
}
]
谁能帮我查询? 谢谢
您可以将聚合管道与$filter
一起使用:
matchingDates
字段,该字段对dates
数组中与条件匹配的项目进行计数。$match
仅具有此类项目的文档。db.collection.aggregate([
{$addFields: {dates: ["2022-06-06", "2022-06-17"]}},
{
$set: {
matchingDates: {
$size: {
$filter: {
input: "$dates",
as: "item",
cond: {
$and: [
{$gte: [{$toDate: "$$item"}, {$toDate: "$startDate"}]},
{$lte: [{$toDate: "$$item"}, {$toDate: "$endDate"}]}
]
}
}
}
}
}
},
{$match: {matchingDates: {$gt: 0}}},
{$unset: ["dates", "matchingDates"]}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.