gpt4 book ai didi

如果与其他日期重叠,MongoDB 查找日期范围

转载 作者:可可西里 更新时间:2023-11-01 09:19:21 24 4
gpt4 key购买 nike

我有许多文档的架构如下所示,每个文档都包含(开始日期、结束日期),如下图所示。有没有一种简单的方法可以在保存新文档之前知道新文档的开始日期、结束日期是否与以前保存的文档的开始日期、结束日期重叠?谢谢

{
"title" : "",
"owner" : "",
"notes" : "",
"startdate" : "",
"enddate" : ""
}

下面是目前唯一保存的文档:

Document.(anonymous function) {_id: "FADnPAxRu4Ps5hkLz", 
title: "Round A",
customerid: "QDGvBQhS6vYgZtnRr",
startdate: "11/21/2014 7:25 AM"…}
_id: "FADnPAxRu4Ps5hkLz"customerid: "QDGvBQhS6vYgZtnRr"
enddate: "11/30/2014 6:09 AM"
startdate: "11/21/2014 7:25 AM"
title: "Round A"__proto__: Document.(anonymous function)

当我尝试对上述文档执行以下任何查询时,即使此处有明显的重叠,它也不会返回任何内容。

db.Projects.find({'startdate': {$lt: '11/25/2014 6:26 PM'}, 'enddate': {$gt: '11/19/2014 6:26 PM'}}, {sort:{time: -1}});

db.Projects.find({'startdate': {$lt: '11/30/2014 6:26 PM'}, 'enddate': {$gt: '11/21/2014 6:26 PM'}}, {sort:{time: -1}});

最佳答案

时间重叠可以用下图中的这 4 种情况来说明,其中 S/E 是新文档的开始日期/结束日期,S'/E' 是任何现有文档的开始日期/结束日期:

  S'                  E' 
|-------------------|

S E
|****************|

S' E'
|-----------|

S' E'
|-----------|

S' E'
|-----------|

在 4 个案例中,我们有 S'<EE'>S .查找时间重叠的所有文档的查询可以是:

db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})

编辑:

您的开始日期和结束日期是字符串格式,没有按词法排序,因此不能使用“$gt”和“$lt”进行比较。您应该将它们转换为 Date 类型:

db.collection.find().forEach(
function (e) {
// convert date if it is a string
if (typeof e.startdate === 'string') {
e.startdate = new Date(e.startdate);
}
if (typeof e.enddate === 'string') {
e.enddate = new Date(e.enddate);
}
// save the updated document
db.collection.save(e);
}
)

最终查询将是:

db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})

关于如果与其他日期重叠,MongoDB 查找日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com