2013-02-27 132 views
10

मैं MongoDB में एक संग्रह है, जो निम्नलिखित की तरह है भीतर दस्तावेजों को हटाने के लिए:

{ 
    "_id" : "5327010328645530500", 
    "members" : [ 
     { 
      "participationCoeff" : 1, 
      "tweetID" : "5327010328645530500" 
     }, 
     { 
      "participationCoeff" : 1, 
      "tweetID" : "2820402625046999289" 
     }, 
     { 
      "participationCoeff" : 0.6666666666666666, 
      "tweetID" : "6122060484520699114" 
     }, 
     { 
      "participationCoeff" : 1, 
      "tweetID" : "4656669980325872747" 
     } 
    ] 
} 
{ 
    "_id" : "2646953848367646922", 
    "members" : [ 
     { 
      "participationCoeff" : 1, 
      "tweetID" : "2646953848367646922" 
     }, 
     { 
      "participationCoeff" : 0.75, 
      "tweetID" : "7750833069621794130" 
     }, 
     { 
      "participationCoeff" : 0.5, 
      "tweetID" : "6271782334664128453" 
     } 
    ] 
} 

असल में, संग्रह समूहों, जहां एक समूह एक _id क्षेत्र और एक members क्षेत्र है है। सदस्य फ़ील्ड दस्तावेजों की एक सरणी है, जिसमें निम्नलिखित प्रारूप हैं।

{ 
      "participationCoeff" : 1, 
      "tweetID" : "5327010328645530500" 
     } 

अब, समय-समय पर, मैं सदस्यों क्लस्टर दस्तावेज़ के गुण में tweetID मिलान करते हुए, इन उप-दस्तावेजों को हटाना होगा।

हालांकि, मैं इस प्रभाव को प्राप्त करने के लिए कोई प्रश्न नहीं ढूंढ पा रहा हूं। असल में, एक ट्वीट ट्वीट कई क्लस्टर में भाग लेगा, और इसलिए विभिन्न समूहों के 'सदस्यों' विशेषता के कई उप-दस्तावेजों में दिखाई देगा। मैं एक थोक $ पुल ऑपरेशन की आपूर्ति करना चाहता हूं, जहां मैं सभी समूहों में सभी उप-दस्तावेजों को हटा सकता हूं (यानी उनके सदस्यों की विशेषता) जो किसी विशेष ट्वीटिड पर मेल खाते हैं।

कुछ मदद और अंतर्ज्ञान वास्तव में सहायक होगा।

उत्तर

15

वास्तव में है यही कारण है कि $pull ऑपरेटर, ऐसा करता है खोल में आप इस्तेमाल कर सकते हैं एक update की तरह:

db.clusters.update({}, 
    {$pull: {members: {tweetID: '5327010328645530500'}}}, 
    {multi: true}) 

multi विकल्प ताकि हर दस्तावेज अद्यतन किया जाता है, न सिर्फ पहले एक निर्धारित करें।

db.clusters -:

+1

निम्न त्रुटि प्राप्त कर रहा है। '$ पुल/$ पुल लागू नहीं कर सकता है गैर-सरणी ' – VaidAbhishek

+1

@VaidAbhishek के लिए सभी संशोधक इसका मतलब है कि आपके पास संग्रह में कुछ दस्तावेज़ हैं जहां' सदस्य 'सरणी नहीं है। – JohnnyHK

+0

मुझे नहीं लगता कि यह मेरे संग्रह के मामले में है। सदस्य क्लस्टर की कड़ाई से सरणी प्रकार विशेषता होगी। क्या समेकन का उपयोग करके ऐसा करने का कोई तरीका है! – VaidAbhishek

2

यह एक एकल क्वेरी में अनेक ट्वीट्स सिर्फ $ में करने के लिए एक सरणी पारित नष्ट करेगा: -

db.clusters.update({}, 
{$pull: {members: {$in: [ {tweetID: '5327010328645530500'},{"tweetID" : "2820402625046999289"} ] } } }, 

{multi: true}) 

उपरोक्त विधि does not को नेवला में तो नेवला के लिए काम करते हैं .update ({}, {$ खींचें: {सदस्य: [{tweetID: '5327010328645530500'}, {"tweetID": "2820402625046999289"}]}}),

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^