अप-वोट और डाउनवोट को लागू करने का यह एक अच्छा तरीका नहीं है। एकत्रीकरण ढांचे के अलावा किसी भी तरह से दस्तावेजों को अद्यतन करने के लिए एक तंत्र नहीं होने के कारण, आपको लगता है कि यह उस तर्क के कारण समाधान हो सकता है जिसे आप कार्यान्वित करना चाहते हैं। लेकिन एग्रीगेट अपडेट नहीं होता है।
आप अपने पर क्या चाहते हैं, इसे "प्रश्न" कहते हैं स्कीमा इस तरह की एक संरचना है:
{
"_id": ObjectId("53f51a844ffa9b02cf01c074"),
"upvoted": [],
"downvoted": [],
"upvoteCount": 0,
"downvoteCount": 0
}
यह कुछ ऐसा है जो परमाणु अद्यतन के साथ अच्छी तरह से काम कर सकता है और वास्तव में आपको एक ही समय में वस्तु के बारे में कुछ राज्यवार जानकारी दे सकता है।
"अपवोट" और "डाउनवोट" सरणियों के लिए, हम इस बात पर विचार करने जा रहे हैं कि "उपयोगकर्ता" वोटिंग का एक समान अद्वितीय ObjectId मान है। तो हम क्या करने जा रहे हैं $push
या $pull
किसी भी सरणी से और उन प्रत्येक ऑपरेशन के साथ काउंटर वैल्यू "वृद्धि/कमी" भी।
यहां बताया गया है कि यह कैसे एक अपवोट के लिए काम करता है:
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 },
}
)
वास्तव में ये दो ऑपरेशन हैं, जिन्हें आप बल्क ऑपरेशंस AP से कर सकते हैं। मैं भी (शायद वास्तव में सबसे अच्छा तरीका) लेकिन इसका एक बिंदु है। पहला कथन केवल उस दस्तावेज़ से मेल खाएगा जहां वर्तमान उपयोगकर्ता के पास सरणी में दर्ज "डाउनवोट" है। वैसे भी, हम पहले से ही उस उपयोगकर्ता आईडी मान को "डाउनवोट्स" सरणी में "धक्का" दे चुके हैं। अगर यह वहां नहीं है तो कोई अपडेट नहीं किया जाता है। लेकिन आप दोनों संबंधित सरणियों से पुश और पुल करते हैं और एक ही समय में काउंटर फ़ील्ड को "वृद्धि/कमी" भी करते हैं।
दूसरे कथन के साथ जो केवल उस चीज़ से मेल खाएगा जहाँ पहले नहीं था, आप एक निष्पक्ष मूल्यांकन करते हैं कि अब आपको "डाउनवोट्स" को छूने की आवश्यकता नहीं है और केवल अपवोट फ़ील्ड को संभालना है। दोनों ही मामलों में सुरक्षित काम यह सुनिश्चित करना है कि मुख्य शर्त यह है कि वर्तमान उपयोगकर्ता आईडी मान "अपवोट" सरणी में मौजूद नहीं है।
डाउनवोट के लिए फ़ील्ड बस उलट जाती हैं:
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 },
}
)
स्वाभाविक रूप से आप प्रश्न में उपयोगकर्ता के लिए किसी भी "अपवोट/डाउनवोट" को रद्द करने के लिए तार्किक प्रगति देख सकते हैं। इसके अलावा, यदि आप चाहें तो इसके बारे में होशियार हो सकते हैं और अपने क्लाइंट में जानकारी को न केवल यह दिखाने के लिए उजागर कर सकते हैं कि वर्तमान उपयोगकर्ता पहले से ही "अपवोट/डाउनवोट" कर चुका है, बल्कि क्लिक क्रियाओं को नियंत्रित करता है और अनावश्यक अनुरोधों को समाप्त करता है।