Không có một cách đơn giản nào để thực hiện việc này trong MongoDB. Tôi đã đưa ra một lựa chọn thay thế có thể phù hợp với bạn. Nếu ngày tháng của bạn diễn ra theo các bước rời rạc, chẳng hạn như trường hợp này dành cho ứng dụng đặt phòng mà người dùng đặt trước đối tượng theo ngày hoặc giờ, thì bạn có thể sử dụng kết hợp các chỉ mục duy nhất và chỉ mục đa khóa. Ví dụ:giả sử đặt chỗ theo ngày. John Q dự trữ từ 11 tháng 10 đến 14 tháng 10, bao gồm cả. Đó là một cái gì đó giống như ngày thứ 281 đến ngày thứ 284 trong năm - hãy giả sử đó chính xác là những ngày đó. Lưu trường đặt chỗ dưới dạng một mảng các ngày được đặt trước
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Đặt một chỉ mục duy nhất trên span
trường.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
Bây giờ bạn không thể chèn một tài liệu có bất kỳ ngày nào trong số đó trong khoảng thời gian của nó:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
Điều này có thể phù hợp với bạn với một số điều chỉnh bổ sung để tính đến năm hoặc nó có thể là một phần của chỉ mục duy nhất kết hợp để làm cho các khoảng thời gian trở thành duy nhất bằng cách ví dụ:room_id
để đặt phòng khách sạn.
Một cách khác là chỉ cần phối hợp các kiểm tra ở phía khách hàng. Nếu bạn có nhiều ứng dụng khách không nói chuyện với nhau, tôi đoán cách tốt nhất để làm điều này là chia sẻ "khóa" trong cơ sở dữ liệu:findAndModify
một tài liệu trong lock
bộ sưu tập để kiểm tra và có được một khóa. Sau khi khách hàng có khóa bằng cách thay đổi một trường trên tài liệu đó, nó có thể thực hiện kiểm tra chồng chéo với một truy vấn và sau đó chèn nếu tất cả đều ổn, sau đó giải phóng khóa bằng cách thay đổi lại cờ trên tài liệu khóa.