Sự trùng lặp về thời gian có thể được minh họa bằng 4 trường hợp này trong hình bên dưới, trong đó S / E là ngày bắt đầu / ngày kết thúc của tài liệu mới và S '/ E' là ngày bắt đầu / ngày kết thúc của bất kỳ tài liệu hiện có nào:
S' E'
|-------------------|
S E
|****************|
S' E'
|-----------|
S' E'
|-----------|
S' E'
|-----------|
Trong 4 trường hợp, chúng ta có S'<E
và E'>S
. Truy vấn để tìm tất cả các tài liệu có thời gian trùng lặp có thể là:
db.collection.find({"startdate": {"$lt": E}, "enddate": {"$gt": S}})
CHỈNH SỬA:
Ngày bắt đầu và ngày kết thúc của bạn ở định dạng chuỗi và không được sắp xếp theo thứ tự từ vựng, do đó không thể sử dụng "$ gt" và "$ lt" để so sánh. Bạn nên chuyển đổi chúng thành loại Ngày:
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);
}
)
Truy vấn cuối cùng sẽ là:
db.collection.find({"startdate": {"$lt": new Date("E")}, "enddate": {"$gt": new Date("S")}})