MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

यदि मौजूद नहीं है तो डालें, अन्यथा MongoDB हटा दें

अप-वोट और डाउनवोट को लागू करने का यह एक अच्छा तरीका नहीं है। एकत्रीकरण ढांचे के अलावा किसी भी तरह से दस्तावेजों को अद्यतन करने के लिए एक तंत्र नहीं होने के कारण, आपको लगता है कि यह उस तर्क के कारण समाधान हो सकता है जिसे आप कार्यान्वित करना चाहते हैं। लेकिन एग्रीगेट अपडेट नहीं होता है।

आप अपने पर क्या चाहते हैं, इसे "प्रश्न" कहते हैं स्कीमा इस तरह की एक संरचना है:

{
    "_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 },
    }
)

स्वाभाविक रूप से आप प्रश्न में उपयोगकर्ता के लिए किसी भी "अपवोट/डाउनवोट" को रद्द करने के लिए तार्किक प्रगति देख सकते हैं। इसके अलावा, यदि आप चाहें तो इसके बारे में होशियार हो सकते हैं और अपने क्लाइंट में जानकारी को न केवल यह दिखाने के लिए उजागर कर सकते हैं कि वर्तमान उपयोगकर्ता पहले से ही "अपवोट/डाउनवोट" कर चुका है, बल्कि क्लिक क्रियाओं को नियंत्रित करता है और अनावश्यक अनुरोधों को समाप्त करता है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मैं नेवला में एकाधिक दस्तावेज़ कैसे अपडेट कर सकता हूं?

  2. MongoDB फ़ील्ड ऑर्डर और दस्तावेज़ स्थिति अद्यतन के बाद बदल जाती है

  3. क्या उल्का परिनियोजित ऐप से डेटा निर्यात करने का कोई आसान तरीका है?

  4. MongoDB दस्तावेज़ को अपडेट नहीं कर सकता क्योंकि _id स्ट्रिंग है, ObjectId नहीं

  5. अद्यतन भूमिका उपयोगकर्ता:कमांड निष्पादित करने के लिए व्यवस्थापक पर अधिकृत नहीं है