सीधे अपने प्रश्न का उत्तर देने के लिए, आपको bson_iter_init (http://api.mongodb पर कॉल करना चाहिए। org/libbson/current/bson_iter_init.html ) डेटा के विरुद्ध आपके द्वारा की जा रही प्रत्येक "नई" क्वेरी के लिए।
संभवतः आपके पास bson_t ऑब्जेक्ट पर एक एकल bson_iter_init कॉल है। आपको बस एक और चाहिए।
bson_iter_t iterator1;
bson_iter_t iterator2;
if (bson_iter_init (&iterator1, doc) &&
bson_iter_find (&iterator1, "fieldA") ) {
//Do something with fieldA
}
if (bson_iter_init (&iterator2, doc) &&
bson_iter_find (&iterator2, "fieldB") ) {
//Do something with fieldB
}
bson_free(doc); //DONT FORGET TO DESTROY THE BSON_T object at the end.
या, बस संयुक्त कमांड का उपयोग करें bson_iter_init_find (http://api.mongodb.org/ libbson/current/bson_iter_init_find.html ) अगर आप इंटर्नल से डील नहीं करना चाहते हैं।
bson_iter_t iterator1;
bson_iter_t iterator2;
if (bson_iter_init_find (&iterator1, doc, "fieldA") ) {
//Do something with fieldA
}
if (bson_iter_init_find (&iterator2, doc,"fieldB") ) {
//Do something with fieldB
}
bson_free(doc); //DONT FORGET TO DESTROY THE BSON_T object at the end.
अगर आप इसमें दिलचस्पी रखते हैं, तो मैं bsonsearch पर काम करता हूं (https://github.com/bauman/bsonsearch ) पुस्तकालय और समान समस्याएं हैं।
आप पॉइंटर्स के साथ कैसे व्यवहार कर रहे हैं, इस पर बहुत सतर्क रहें। libbson में हुड के नीचे लगभग सब कुछ स्मृति में एक क्षेत्र में पॉइंटर्स में हेरफेर कर रहा है।
मैटर्स को ऑर्डर करने का कारण यह है कि आपने एक बार इनिशियलाइज़ किया था, जब आपने iter_find को कॉल किया था, तो libbson A का पता लगाने के लिए B की तलाश करेगा . बी को खोजने के लिए बाद की कॉल बफर के अंत की तलाश करेगी और इसे याद करेगी। आप पुनरावर्तक को स्थिति 0 पर पुन:प्रारंभ करके उस समस्या से बचते हैं और वहां से तलाश शुरू करते हैं।
जब तक आप ठीक से नहीं जानते कि आप क्या कर रहे हैं और बफर के आस-पास की तलाश को अनुकूलित करना चाहते हैं, तो शायद हर खोज के लिए इटरेटर को फिर से शुरू करना सबसे अच्छा है।