2014-11-11 5 views
2

У меня есть много документов со схемой, показанной ниже, каждая из которых содержит (дата начала, конец), как показано на схеме ниже. Есть ли простой способ узнать, прежде чем сохранять новый документ, если новый документ startdate, enddate будет перекрываться с ранее сохраненными документами startdate, enddate? БлагодаряMongoDB найти диапазон дат, если накладывается на другие даты

{ 
    "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}}); 
+1

ваших «даты» являются строками и не лексически прописал. Преобразуйте их в соответствующие [Тип даты] (http://docs.mongodb.org/manual/reference/bson-types/#date). –

ответ

7

времени перекрытие может быть проиллюстрировано с этими 4 случаев в приведенном ниже рисунке, где S/Е представляет собой StartDate/EndDate нового документа и S «/ Е» StartDate/EndDate любого существующего документа:

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

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

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

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

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

В 4 случаях у нас есть S'<E и E'>S. Запрос, чтобы найти все документы с перекрытым временем может быть:

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

EDIT:

Вашего 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")}}) 
+0

Спасибо за вашу помощь, но я не получаю никаких результатов от выполнения вышеуказанного запроса, несмотря на совпадение даты или нет. Я всегда получаю LocalCollection.Cursor {коллекция: LocalCollection, сортировщик: Minimongo.Sorter, _selectorId: undefined, matcher: Minimongo .Matcher, skip: undefined ...} ... какая-нибудь подсказка, что я могу потерять, не так ли? Еще раз спасибо – MChan

+0

@MChan, Отправьте свой запрос и некоторые ваши данные, чтобы мы могли узнать, в чем проблема. – anhlc

+0

Я обновил вопрос только с сохраненным документом и запросами, которые я пытаюсь выполнить. – MChan

Смежные вопросы