Có một số "trường hợp rất hữu ích" ở đây mà trên thực tế, việc cố gắng tạo một "băm duy nhất" trên nội dung mảng thực sự đang "cản trở" vô số vấn đề có thể dễ dàng giải quyết.
Tìm điểm chung cho "Tôi"
Ví dụ:nếu bạn lấy "người dùng 1" từ mẫu được cung cấp và cho rằng bạn đã tải xong dữ liệu đó và muốn tìm "những điểm chung với tôi" theo "itemsIds" phù hợp từ những gì đối tượng người dùng hiện tại có, thì ở đó là hai cách tiếp cận truy vấn đơn giản:
-
Tìm "giống hệt": Là nơi bạn muốn kiểm tra dữ liệu người dùng khác để xem những người dùng có cùng sở thích "chính xác". Đây là cách sử dụng đơn giản và "không có thứ tự" đối với
$ tất cả
toán tử truy vấn:db.collection.find({ "itemsIds": { "$all": [399957190, 366369952] }, "userId": { "$ne": 1 } })
Điều này sẽ trả về "người dùng 3" vì họ là người có "cả hai" mục nhập "itemsIds" chung. Thứ tự không quan trọng ở đây vì nó luôn khớp theo bất kỳ thứ tự nào, miễn là cả hai đều ở đó. Đây là một dạng khác của
$ và
dưới dạng đối số truy vấn. -
Tìm điểm chung "tương tự" với tôi ": Về cơ bản, câu hỏi là "bạn có điều gì giống nhau không?" . Để làm được điều đó, bạn có thể sử dụng
$ in
toán tử truy vấn. Nó sẽ khớp nếu "một trong hai" điều kiện được chỉ định được đáp ứng:db.collection.find({ "itemsIds": { "$in": [399957190, 366369952] }, "userId": { "$ne": 1 } })
Trong trường hợp này, "cả" "người dùng 2" và "người dùng 3" sẽ khớp nhau, vì họ "ít nhất" chia sẻ "một" điều kiện được chỉ định và điều đó có nghĩa là có "điểm chung" với dữ liệu nguồn của truy vấn.
Trên thực tế, đây là một dạng khác của
$ hoặc
toán tử truy vấn, và giống như trước đây, viết theo cách này đơn giản và ngắn gọn hơn rất nhiều với các điều kiện được áp dụng.
Tìm "Những điều" phổ biến
Cũng có những trường hợp bạn có thể muốn tìm những thứ "chung" mà không cần có "người dùng" cơ sở để bắt đầu. Vậy làm cách nào để bạn biết rằng "người dùng 1" và "người dùng 2" chia sẻ cùng một "itemIds" hoặc thực tế là nhiều người dùng có thể chia sẻ cùng một giá trị "itemIds" riêng lẻ, nhưng họ là ai?
-
Nhận kết quả phù hợp chính xác: Tất nhiên là nơi bạn xem xét các giá trị "itemsIds" và
$ group
Họ cùng nhau. Nói chung "đơn đặt hàng là quan trọng" ở đây, vì vậy, tối ưu là bạn nên "đặt trước" chúng và luôn luôn làm cho việc này đơn giản như:db.collection.aggregate([ { "$group": { "_id": "$itemsIds", "common": { "$push": "$userId" } }} ])
Và đó là tất cả những gì thực sự có, miễn là đơn đặt hàng đã có sẵn. Nếu không, thì bạn có thể thực hiện một biểu mẫu dài hơn một chút để thực hiện "đặt hàng", nhưng điều tương tự cũng có thể được nói là tạo "băm":
db.collection.aggregate([ { "$unwind": "$itemsIds" }, { "$sort": { "_id": 1, "itemsIds": 1 } }, { "$group": { "_id": "$_id", "userId": { "$first": "$userId" }, "itemsIds": { "$push": "$itemsIds" } }}, { "$group": { "_id": "$itemsIds", "common": { "$push": "$userId" } }} ])
Không phải là người thực hiện "siêu", nhưng nó tạo nên lý do tại sao bạn luôn giữ trật tự khi bổ sung các mục nhập mảng. Đây là một quá trình rất đơn giản.
-
"Người dùng" phổ biến đối với "mặt hàng": Đó là một quy trình đơn giản khác được trừu tượng hóa ở trên với "chia nhỏ" mảng trong
$ unwind
và sau đó về cơ bản nhóm lại:db.collection.aggregate([ { "$unwind": "$itemsIds" }, { "$group": { "_id": "$itemsIds", "users": { "$addToSet": "$userId" } }} ])
Và một lần nữa, chỉ là một trình tổng hợp nhóm đơn giản của
$ addToSet
thực hiện công việc và thu thập các giá trị "userId riêng biệt" cho mỗi giá trị "itemsIds".
Đây là tất cả các giải pháp cơ bản và tôi có thể tiếp tục với "thiết lập giao lộ" và những gì không, nhưng đây là "mồi".
Đừng cố gắng tính toán một "băm", dù sao thì MongoDB cũng có một "kho vũ khí" tốt để khớp các mục nhập. Sử dụng nó và "lạm dụng nó", cho đến khi nó bị hỏng. Sau đó, hãy cố gắng hơn nữa.