時間の重複は、次の図の4つのケースで説明できます。ここで、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}})
編集:
開始日と終了日は文字列形式であり、字句順に並べられていないため、比較に「$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")}})