MongoDBでこれを行うための完全に簡単な方法はありません。私はあなたのために働くことができる1つの代替オプションを作り上げました。ユーザーが日または時間ごとにオブジェクトを予約する予約アプリケーションの場合のように、日付が個別のステップで来る場合は、一意のインデックスとマルチキーインデックスの組み合わせを使用できます。たとえば、予約が日単位であるとします。 John Qは、10月11日から10月14日までを予約します。これは、1年の281日から284日のようなものです。これが、まさにその日であると仮定しましょう。予約フィールドを予約された日の配列として保存します
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
span
に一意のインデックスを付ける フィールド。
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
現在、そのスパンにそれらの日が含まれるドキュメントを挿入することはできません:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
これは、年を考慮に入れるためにいくつかの追加の調整を行うことで機能する場合があります。または、たとえば、期間を一意にするための複合一意インデックスの一部である場合があります。 room_id
ホテル予約用。
もう1つの方法は、クライアント側でチェックを調整することです。互いにまったく通信しない複数のクライアントがある場合、これを行うための最良の方法は、データベース内の「ロック」を共有することだと思います:findAndModify
lock
内のドキュメント ロックをチェックして取得するためのコレクション。クライアントがそのドキュメントのフィールドを変更してロックを取得すると、クエリとの重複をチェックし、問題がなければ挿入してから、ロックドキュメントのフラグを再度変更してロックを解除できます。