我有很多文档,下面显示的模式包含(开始日期,结束日期),如下图所示。如果新文档startdate,enddate将与之前保存的文件startdate,enddate重叠,是否有一种简单的方法可以在保存新文档之前知道?感谢
{
"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}});
答案 0 :(得分:11)
时间重叠可以用下图中的这四种情况来说明,其中S / E是新文件的开始/结束日期,S'/ E'是任何现有文件的开始/结束日期:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
在4个案例中,我们有S'<E
和E'>S
。查找具有重叠时间的所有文档的查询可以是:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
编辑:
你的startdate和enddate是字符串格式,而不是词法排序,因此不能使用“$ gt”和“$ lt”进行比较。您应该将它们转换为日期类型:
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")}})