如何在特定日期间隔内查找
Posted
技术标签:
【中文标题】如何在特定日期间隔内查找【英文标题】:How to find in specific date interval 【发布时间】:2020-09-18 21:34:21 【问题描述】:我在 Mongodb 中找不到想要的文档和列表字段的片段。所以我有以下文件:
"_id": "5ed38e5d2a6e74567c7a579c",
"id": "AAA",
"events": [
"dayTypeId": "5e71e1918ee9a326ebdf1611",
"startDate":
"$date": "2020-06-01T00:00:00.000Z"
,
"endDate":
"$date": "2020-06-04T00:00:00.000Z"
,
"stared": false,
"userId": "XXX",
"mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
,
"dayTypeId": "5e71e1918ee9a326ebdf1611",
"startDate":
"$date": "2020-06-10T00:00:00.000Z"
,
"endDate":
"$date": "2020-06-10T00:00:00.000Z"
,
"stared": false,
"userId": "XXX",
"mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
,
"dayTypeId": "5e71d8628ee9a326e7df160d",
"startDate":
"$date": "2020-06-05T00:00:00.000Z"
,
"endDate":
"$date": "2020-06-09T00:00:00.000Z"
,
"stared": false,
"userId": "XXX",
"mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
,
"dayTypeId": "5e71d8628ee9a326e7df160d",
"startDate":
"$date": "2020-07-13T00:00:00.000Z"
,
"endDate":
"$date": "2020-07-21T00:00:00.000Z"
,
"stared": false,
"userId": "XXXX",
"mixing": "wjk0ra1v7m88p0x5aaxwndkmwmlxx4pn92hzjlgpl34u8ojx855m8e8spp1v7l57omtoc4qxbv0g22nybqubd3hq5skuff8ezbzdum2a92itwco64tbi5y2p5mboznxiuwynv0rb8eqk9d80ib65cve6ab9p1d1divee3wbywc2st1lkjruqvgu42zgx8mjtsnb8gyeqtxycl4ujpllgxpshdu8o97iiw347bjqv4mrv6jgwq4r21zp5rm4dw6a1"
]
我想获取startDate
或endDate
在02.06.2020-11.06.2020
范围内的“事件”列表片段。
例如,在我的示例数据中,我希望返回除最后一个元素之外的所有元素。
【问题讨论】:
范围区间的目标是哪个字段:startDate
或 endDate
?还是两者兼而有之?
两者。开始日期:2020 年 6 月 2 日,结束日期:2020 年 6 月 11 日。我使用了 $gte 和 $lte 但我没有得到正确的结果。
所以...你的范围区间必须覆盖开始和结束,这意味着 interval_start 是 gte startDate
而 interval_end 是 lte endDate
?
【参考方案1】:
您可以使用$filter 过滤掉任何不符合您条件的事件:
db.collection.aggregate([
$match:
$or: [
"events.startDate": $gte: new Date("2020-06-02"), $lte: new Date("2020-06-11")
,
"events.endDate": $gte: new Date("2020-06-02"), $lte: new Date("2020-06-11")
]
,
$project:
events:
$filter:
input: "$events",
as: "event",
cond:
$or: [
$and: [
$gte: ["$$event.startDate", new Date("2020-06-02")],
$lte: ["$$event.startDate", new Date("2020-06-11")],
]
,
$and: [
$gte: ["$$event.endDate", new Date("2020-06-02")],
$lte: ["$$event.endDate", new Date("2020-06-11")],
]
]
])
【讨论】:
我的朋友,由于“startDate”和“endDate”位于“events”列表中,此代码无法正常工作。请考虑。 啊,您希望它们在所有文档中匹配吗?是否需要保留文档结构。 我只需要包含所需元素的事件列表。是的,我想检查事件列表中的所有元素 我的朋友你有什么发现吗? 我编辑了答案以使用$filter
,因为事件在数组中。以上是关于如何在特定日期间隔内查找的主要内容,如果未能解决你的问题,请参考以下文章
范围连接 data.frames - R 中具有日期范围/间隔的特定日期列