2012-05-04 5 views
5

उदाहरण के लिए, अगर मैं खोल में ऐसाC++ ड्राइवर का उपयोग कर वेक्टर में mongodb सरणी को कैसे सहेजना है?

> db.numbers.save({ name: "fibonacci", arr: [0, 1, 1, 2, 3, 5, 8, 13, 21] }) 

तब मैं अपने C++ कार्यक्रम में arr प्राप्त करना चाहते हैं।

के बाद मैं BSONObj मिला मैं

std::string name = p.getStringField("name"); 

जहां p एक BSON वस्तु है साथ name मिल सकती है।

लेकिन सरणी से तत्व प्राप्त करने और उन्हें std :: vector में सहेजने का सही तरीका क्या है?

संपादित करें:

कुछ और अनुसंधान के बाद मैं BSONElement Doxygen प्रलेखन पाया जाता है और यह बना दिया।

std::vector<int> arr; 
std::vector<BSONElement> v = p.getField("arr").Array(); 
for(std::vector<BSONElement>::iterator it = v.begin(); it != v.end(); ++it) 
    arr.push_back(it->numberInt()); 

लेकिन मुझे अभी भी यह सुनिश्चित नहीं है कि यह सही तरीका है या नहीं।

उत्तर

6

दो अन्य तरीकों:

// this way is easy but requires exact type match (no int64->int32 conversion) 
std::vector<int> ints; 
p.getObjectField("arr").vals(ints); // skips non int values 
p.getObjectField("arr").Vals(ints); // asserts on non int values 

या

// this way is more common and does the conversion between numeric types 
vector<int> v; 
BSONObjIterator fields (p.getObjectField("arr")); 
while(fields.more()) { 
    v.push_back(fields.next().numberInt()); 
} 

//same as above but using BSONForEach macro 
BSONForEach(e, p.getObjectField("arr")) { 
    v.push_back(e.numberInt()); 
} 
वैकल्पिक रूप से

, तो आप सिर्फ एक vector<BSONElement> के रूप में उत्पादन छोड़ने के लिए और उन्हें सीधे इस्तेमाल कर सकते हैं, लेकिन तब क्या आप वाकई होने की आवश्यकता होगी कि BSONObj वेक्टर से बाहर निकल जाएगा।

+0

मुझे आशा है कि पहला फॉर्म उतना बेहतर होगा जितना कि लोड होने के लिए सामानों का सेट बड़ा हो जाएगा, क्योंकि कार्यान्वयन में वेक्टर के अंतिम आकार के साथ 'बूस्ट :: वेक्टर <> :: रिजर्व() 'को कॉल करने का मौका है। – lurscher

+0

वास्तव में, यह नहीं है। बीएसओएन प्रारूप के तरीके के कारण, यह जानने का कोई तरीका नहीं है कि किसी ऑब्जेक्ट/सरणी में इसके बिना पुनरावृत्त किए जाने के कितने तत्व हैं। यदि आप vals के कार्यान्वयन को देखते हैं, तो आप देखेंगे कि यह लगभग दूसरे संस्करण के समान है। इसमें क्या मतभेद हैं, वास्तव में इसे धीमे (थोड़ा) धीमा करने की अधिक संभावना होगी, लेकिन इससे कोई फर्क नहीं पड़ता। – mstearn

+0

ओह, यह बहुत बुरा है। – lurscher

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