MCh*_*han 3 mongodb mongodb-query
我有很多文档,下面显示的模式包含(开始日期,结束日期),如下图所示.如果新文档startdate,enddate将与先前保存的文件startdate,enddate重叠,是否有一种简单的方法可以在保存新文档之前知道?谢谢
{
"title" : "",
"owner" : "",
"notes" : "",
"startdate" : "",
"enddate" : ""
}
Run Code Online (Sandbox Code Playgroud)
以下是目前保存的唯一文档:
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)
Run Code Online (Sandbox Code Playgroud)
当我尝试在上面的文档上执行以下任何查询时,它什么都不返回,即使这里有明显的重叠.
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}});
Run Code Online (Sandbox Code Playgroud)
anh*_*hlc 11
时间重叠可以通过下图中的这4种情况来说明,其中S/E是新文档的开始/结束日期,S'/ E'是任何现有文档的开始/结束日期:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
Run Code Online (Sandbox Code Playgroud)
在4个案例中我们有S'<E和E'>S.查找具有重叠时间的所有文档的查询可以是:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
Run Code Online (Sandbox Code Playgroud)
编辑:
你的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);
}
)
Run Code Online (Sandbox Code Playgroud)
最终的查询将是:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3050 次 |
| 最近记录: |