Một điều bạn cần lưu ý ở đây là bạn có thể không cần phải làm tất cả công việc mà bạn nghĩ mình cần và vấn đề của bạn có thể được giải quyết với sự trợ giúp nhỏ từ Chỉ mụcTTL và có thể bộ sưu tập giới hạn . Hãy xem xét các mục sau:
{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
Vì vậy, có hai mục nhập và bạn đã nhận được _id
đó giá trị trở lại khi bạn đã chèn. Vì vậy, lúc đầu, "A" không có ai để đối đầu, nhưng mục nhập cho "B" sẽ đấu với mục nhập trước nó.
ObejctId là monotonic , có nghĩa là cái "tiếp theo" là luôn luôn có giá trị lớn hơn so với giá trị cuối cùng. Vì vậy, với dữ liệu được chèn, chỉ cần thực hiện điều này:
db.moves.find({
_id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") },
user: { $ne: "B" }
}).limit(1)
Điều đó cho phép "di chuyển" được chèn trước đó thành di chuyển hiện tại vừa được thực hiện và thực hiện điều này vì bất cứ điều gì đã được chèn trước đó sẽ có _id
với giá trị thấp hơn so với mục hiện tại. Bạn cũng đảm bảo rằng bạn không "nghịch" nước đi của chính người dùng và tất nhiên bạn chỉ giới hạn kết quả trong một tài liệu.
Vì vậy, "chuyển động" sẽ mãi mãi tiến về phía trước, Khi lần chèn tiếp theo được thực hiện bởi người dùng "C", họ sẽ nhận được "chuyển động" từ người dùng "B", và sau đó người dùng "A" sẽ nhận được "chuyển động" từ người dùng "C ", và như vậy.
Tất cả những gì "có thể" xảy ra ở đây là "B" thực hiện tiếp theo "di chuyển" theo trình tự, và bạn sẽ lấy tài liệu tương tự như trong yêu cầu cuối cùng. Nhưng đó là một điểm cho của bạn thiết kế "phiên", để lưu trữ "kết quả" cuối cùng và đảm bảo rằng bạn không lấy lại điều tương tự và như vậy, hãy giải quyết vấn đề đó tuy nhiên bạn muốn trong thiết kế của bạn.
Đó là đủ để "chơi" với. Nhưng chúng ta hãy chuyển đến " xóa của bạn "phần.
Tự nhiên bạn "nghĩ rằng" bạn muốn xóa mọi thứ, nhưng trở lại với "người trợ giúp" ban đầu của tôi, điều này không cần thiết. Từ phía trên, việc xóa chỉ trở thành một yếu tố "dọn dẹp", vì vậy bộ sưu tập của bạn không phát triển đến tỷ lệ lớn.
Nếu bạn đã áp dụng chỉ mục TTL, theo cách tương tự như hướng dẫn này giải thích, các mục trong bộ sưu tập của bạn sẽ được dọn dẹp cho bạn và bị xóa sau một khoảng thời gian nhất định.
Ngoài ra, những gì có thể được thực hiện và đặc biệt là xem xét rằng chúng tôi đang sử dụng ngày càng tăng bản chất của _id
và rằng đây ít nhiều là một "hàng đợi" về bản chất, bạn có thể áp dụng điều này làm bộ sưu tập giới hạn
. Vì vậy, bạn có thể đặt kích thước tối đa cho số lượng "lần di chuyển" mà bạn sẽ giữ tại bất kỳ thời điểm nào.
Kết hợp cả hai với nhau, bạn sẽ có được một thứ chỉ "phát triển" đến một kích thước nhất định và sẽ tự động được làm sạch cho bạn, nếu hoạt động chậm lại một chút. Và điều đó sẽ giữ cho tất cả các hoạt động luôn nhanh chóng .
Điểm mấu chốt là sự đồng thời của " xóa "mà bạn lo lắng đã được xóa bằng cách thực sự" loại bỏ "nhu cầu xóa các tài liệu vừa được phát. Truy vấn giữ cho nó đơn giản và chỉ mục TTL và bộ sưu tập giới hạn sẽ giúp bạn quản lý dữ liệu.
Vì vậy, bạn có những gì tôi đảm nhận trong một trò chơi rất đồng thời là "Blind War".