2012-04-18 15 views
5

मेरे पास एक प्रति दिन प्रति दस्तावेज़ है। मैं डेटा सरणी में एक और उप-दस्तावेज़ कैसे जोड़ सकता हूं और यदि वह मौजूद नहीं है तो पूरा दस्तावेज़ बनाएं?Mongodb एम्बेडेड दस्तावेज़

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

क्या मैं उस उद्देश्य के लिए अपरर्ट का उपयोग कर सकता हूं?

परिणाम हो सकता है अगर दस्तावेज़ मौजूद है:

 
{ 
    "key": "20120418_123456789", 
    "data":[ 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:00:00.0Z"), 
    "Energy": 25, 
    "PMin": 11, 
    "PMax": 16 
    }, 
    { 
    "Meter": 123456789, 
    "Dt": ISODate("2011-12-29T16:15:00.0Z"), 
    "Energy": 22, 
    "PMin": 13, 
    "PMax": 17 
    } 
    ], 
    "config": {"someparam": 4.5} 
} 

अग्रिम धन्यवाद

उत्तर

9

मुझे लगता है कि क्या आप चाहते हैं $ addToSet आदेश है - कि एक सरणी के लिए एक तत्व धक्का केवल तभी यह नहीं है पहले से ही मौजूद।

db.meters.findOne() 
{ 
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"), 
    "config" : { 
     "someparam" : 4.5 
    }, 
    "data" : [ 
     { 
      "Meter" : 123456789, 
     } 
    ], 
    "key" : "20120418_123456789" 
} 

अब चलाएँ:: मैं अपने उदाहरण संक्षिप्तता के लिए थोड़ा आसान बना दिया है

db.meters.update({"key" : "20120418_123456789"}, {"$addToSet": {"data" : {"Meter" : 1234}}}) 

और हम अद्यतन संस्करण मिलता है: फिर से

db.meters.findOne() 
{ 
    "_id" : ObjectId("4f8e95a718bc9c7da1e6511a"), 
    "config" : { 
     "someparam" : 4.5 
    }, 
    "data" : [ 
     { 
      "Meter" : 123456789, 
     }, 
     { 
      "Meter" : 1234 
     } 
    ], 
    "key" : "20120418_123456789" 
} 

रन ही कमान और परिणाम अपरिवर्तित है

नोट: आप इन दस्तावेजों को बढ़ने की संभावना रखते हैं, खासकर यदि यह क्षेत्र असंबद्ध है और इस तरह से अद्यतन करके लगातार (अपेक्षाकृत महंगा) चाल चल रहा है - आपको इस बारे में विचारों के बारे में विचार करना चाहिए कि इसे कैसे कम किया जाए:

http://www.mongodb.org/display/DOCS/Padding+Factor#PaddingFactor-ManualPadding

+0

मैं प्रतिदिन 400000 addToSet ... दस्तावेज़ प्रति 96 डेटा करना होगा। ऐसा लगता है धीमा लगता है ... क्या ऐसा करने के अन्य तरीके हैं? – hotips

+0

जैसा कि बताया गया है, आप इस तरह से मूल्यों की एक सरणी को बढ़ाकर कई चालों को ट्रिगर करने जा रहे हैं - इससे धीमा हो जाएगा, जब तक आप किसी भी तरीके से सरणी को बाध्य नहीं करते हैं और इसके अधिकतम आकार की भविष्यवाणी कर सकते हैं - तो आप इसे उचित रूप से पैड कर सकते हैं और अपडेट बहुत तेज़ होंगे। यदि आप ऐसा नहीं कर सकते हैं तो शायद आपको एक अलग स्कीमा पर विचार करना चाहिए और एक एम्बेडेड सरणी के बजाय डेटा को किसी अन्य संग्रह में रखना चाहिए। –

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