Đó không phải là một cách tốt để thực hiện lượt ủng hộ và lượt phản đối. Ngoài việc khung tổng hợp không phải là một cơ chế để cập nhật tài liệu theo bất kỳ cách nào, bạn dường như đã hướng tới suy nghĩ rằng nó có thể là một giải pháp do logic mà bạn muốn thực hiện. Nhưng tổng hợp không cập nhật.
Những gì bạn muốn trên của bạn, hãy gọi nó là một lược đồ "câu hỏi" là một cấu trúc như thế này:
{
"_id": ObjectId("53f51a844ffa9b02cf01c074"),
"upvoted": [],
"downvoted": [],
"upvoteCount": 0,
"downvoteCount": 0
}
Đó là thứ có thể hoạt động tốt với các bản cập nhật nguyên tử và thực sự cung cấp cho bạn một số thông tin trạng thái về đối tượng cùng một lúc.
Đối với mảng "ủng hộ" và "phản đối", chúng tôi sẽ xem xét rằng việc bỏ phiếu của "người dùng" có giá trị ObjectId duy nhất giống nhau. Vì vậy, những gì chúng ta sẽ làm là $push
hoặc $pull
từ một trong hai mảng và cả "tăng / giảm" các giá trị bộ đếm cùng với mỗi hoạt động đó.
Đây là cách điều này hoạt động cho một ủng hộ:
db.questions.update(
{
"_id": ObjectId("53f51a844ffa9b02cf01c074"),
"upvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
"downvoted": ObjectId("53f51c0a4ffa9b02cf01c075")
},
{
"$push": { "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
"$inc": { "upvoteCount": 1, "downvoteCount": -1 },
"$pull": { "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
}
)
db.questions.update(
{
"_id": ObjectId("53f51a844ffa9b02cf01c074"),
"upvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
},
{
"$push": { "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
"$inc": { "upvoteCount": 1 },
}
)
Trên thực tế, đó là hai hoạt động mà bạn có thể thực hiện với AP hoạt động hàng loạt Tôi cũng vậy (có lẽ là cách tốt nhất thực sự) nhưng nó có một điểm của nó. Câu lệnh đầu tiên sẽ chỉ khớp với tài liệu mà người dùng hiện tại có "phiếu phản đối" được ghi trong mảng. Do đó, chúng tôi đã "đẩy" giá trị id người dùng đó vào mảng "phiếu phản đối". Nếu nó không có ở đó thì không có cập nhật nào được thực hiện. Nhưng bạn vừa đẩy và kéo từ các mảng tương ứng, vừa "tăng / giảm" các trường bộ đếm cùng một lúc.
Với câu lệnh thứ hai sẽ chỉ khớp với điều gì đó mà câu thứ nhất không khớp, bạn đưa ra một đánh giá công bằng rằng bây giờ bạn không cần phải chạm vào "phiếu phản đối" và chỉ cần xử lý các trường ủng hộ. Trong cả hai trường hợp, điều an toàn cần làm là đảm bảo rằng điều kiện chính là giá trị id người dùng hiện tại không có trong mảng "được ủng hộ".
Đối với phiếu phản đối, các trường chỉ được đảo ngược:
db.questions.update(
{
"_id": ObjectId("53f51a844ffa9b02cf01c074"),
"downvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
"upvoted": ObjectId("53f51c0a4ffa9b02cf01c075")
},
{
"$pull": { "upvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
"$inc": { "upvoteCount": -1, "downvoteCount": 1 },
"$push": { "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
}
)
db.questions.update(
{
"_id": ObjectId("53f51a844ffa9b02cf01c074"),
"downvoted": { "$ne": ObjectId("53f51c0a4ffa9b02cf01c075") }
},
{
"$push": { "downvoted": ObjectId("53f51c0a4ffa9b02cf01c075") },
"$inc": { "downvoteCount": 1 },
}
)
Đương nhiên, bạn có thể thấy tiến trình hợp lý để chỉ cần hủy bất kỳ "upvote / downvote" nào cho người dùng được đề cập. Ngoài ra, bạn có thể thông minh về nó nếu bạn muốn và để thông tin trong ứng dụng khách của bạn không chỉ hiển thị nếu người dùng hiện tại đã "ủng hộ / phản đối" mà còn kiểm soát các hành động nhấp chuột và loại bỏ các yêu cầu không cần thiết.