์ปค์์์ ๋ฐ์ดํฐ ์ก์ธ์ค
์ด ํ์ด์ง์ ๋ด์ฉ
๊ฐ์
์ด ๊ฐ์ด๋ ์์๋ C++ ์ด์ ์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ปค์ ์์ ๋ฐ์ดํฐ์ ์ก์ธ์ค ํ๋ ๋ฐฉ๋ฒ์ ํ์ต ์ ์์ต๋๋ค.
์ปค์ ๋ ์ฝ๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ฐฐ์น๋ก ๋ฐํํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ปค์๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ํ ๋ฒ์ ๋ฐํํ๋ ๋์ ์ฃผ์ด์ง ์๊ฐ์ ๋ฌธ์์ ํ์ ์งํฉ๋ง ๋ณด์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์๋น์ ๋คํธ์ํฌ ๋์ญํญ ์ฌ์ฉ๋์ ๋ชจ๋ ์ค์ ๋๋ค.
C++ ์ด์ ์ ๊ฐ find()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ธฐ ์์
์ ์ํํ ๋๋ง๋ค mongocxx::cursor
์ธ์คํด์ค ์์ ์ผ์นํ๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
์ํ ๋ฐ์ดํฐ
์ด ๊ฐ์ด๋ ์ ์์ ์์๋ Atlas ์ํ ๋ฐ์ดํฐ ์ธํธ ์ sample_restaurants
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์๋ restaurants
์ปฌ๋ ์
์ ์ฌ์ฉํฉ๋๋ค. C++ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ด ์ปฌ๋ ์
์ ์ก์ธ์ค ํ๋ ค๋ฉด Atlas cluster ์ ์ฐ๊ฒฐํ๋ mongocxx::client
๋ฅผ ์ธ์คํด์คํํ๊ณ db
๋ฐ collection
๋ณ์์ ๋ค์ ๊ฐ์ ํ ๋นํฉ๋๋ค.
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
๋ฌด๋ฃ MongoDB Atlas cluster ๋ฅผ ์์ฑํ๊ณ ์ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ํ์ต ๋ณด๋ ค๋ฉด Atlas ์์ํ๊ธฐ ๊ฐ์ด๋ ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ชจ๋ ์ปค์ ๋ฌธ์ ์กฐํ
mongocxx::cursor
์ธ์คํด์ค ์ ๋ด์ฉ์ ๋ฐ๋ณตํ๋ ค๋ฉด for
๋ฃจํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ค์ ์์ ์์๋ find()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ name
๊ฐ์ด "Dunkin' Donuts"
์ธ ๋ชจ๋ ๋ฌธ์๋ฅผ ์กฐํ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ find()
๋ฉ์๋์์ ๋ฐํ๋ ์ปค์ ์์ ๊ฐ ๋ฌธ์ ๋ฅผ ์ธ์ํฉ๋๋ค.
auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts"))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" } { "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40363098" } { "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40395071" } ...
๋ฌธ์ ๊ฐ๋ณ ์กฐํ
์ปค์ ์์ ๊ฐ๋ณ ๋ฌธ์ ๋ฅผ ์กฐํ ํ๋ ค๋ฉด mongocxx::cursor
์ธ์คํด์ค ์์ begin()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ปค์ ์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฆฌํค๋ mongocxx::cursor::iterator
์ธ์คํด์ค ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ค์ ์์ ์์๋ ์ปฌ๋ ์
์์ name
๊ฐ์ด "Dunkin' Donuts"
์ธ ๋ชจ๋ ๋ฌธ์๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ begin()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ปค์ ์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ์ธ์ํฉ๋๋ค.
auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts"))); auto doc = cursor.begin(); std::cout << bsoncxx::to_json(*doc) << std::endl;
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" }
ํ ์ผ ์ปค์(tailable cursor)
๊ณ ์ ์ฌ์ด์ฆ ๊ณ ์ ์ฌ์ด์ฆ ์ปฌ๋ ์
์ ์ฟผ๋ฆฌํ ๋๋ ํด๋ผ์ด์ธํธ ๊ฐ ์ปค์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ํ์๋ ๊ณ์ ์ด๋ ค ์๋ ํ
์ผ ์ปค์( tailable cursor )๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ
์ผ ์ปค์( tailable cursor)๋ฅผ ๋ง๋ค๋ ค๋ฉด mongocxx::options::find
๊ฐ์ฒด ๋ฅผ ์ธ์คํด์คํํ๊ณ ํด๋น cursor_type
ํ๋ ๋ฅผ mongocxx::cursor::type::k_tailable
์ผ)๋ก ์ค์ ํ๋ค ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ mongocxx::options::find
์ธ์คํด์ค ๋ฅผ find()
๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
์๋ฅผ ์์, ๋ค์ ์ฝ๋์ ๊ฐ์ด ์ผ์ฑ๋ฅผ ๋ํ๋ด๋ ๋ฌธ์๋ฅผ ์ ์ฅํ๋ vegetables
์ด๋ผ๋ ๊ณ ์ ์ฌ์ด์ฆ ์ปฌ๋ ์
์ ๋ง๋ค ์ ์์ต๋๋ค.
auto db = client["db"]; auto collection = db.create_collection("vegetables", make_document(kvp("capped", true), kvp("size", 1024 * 1024))); std::vector<bsoncxx::document::value> vegetables; vegetables.push_back(make_document(kvp("name", "cauliflower"))); vegetables.push_back(make_document(kvp("name", "zucchini"))); auto result = collection.insert_many(vegetables);
๋ค์ ์ฝ๋์์๋ ํ
์ผ ์ปค์( tailable cursor )๋ฅผ ์ฌ์ฉํ์ฌ vegetables
์ปฌ๋ ์
์ ๋ชจ๋ ๋ฌธ์๋ฅผ ์กฐํ ํฉ๋๋ค. ์ปค์ ๊ฐ ๋ชจ๋ ์์ง๋๋ฉด ์ธ ๊ฐ์ ๋ฌธ์๋ฅผ ๊ฒ์ํ ๋๊น์ง ์ปค์๊ฐ ์ด๋ฆฐ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
mongocxx::options::find opts{}; opts.cursor_type(mongocxx::cursor::type::k_tailable); auto cursor = collection.find({}, opts); int docs_found = 0; while (docs_found < 3) { for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; docs_found++; } // Sleeps for 100 milliseconds before trying to access more documents std::this_thread::sleep_for(std::chrono::milliseconds(100)); }
{ "_id" : { "$oid" : "..." }, "name" : "cauliflower" } { "_id" : { "$oid" : "..." }, "name" : "zucchini" }
vegetables
์ปฌ๋ ์
์ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ฝ์
ํ๋ ๊ฒฝ์ฐ ์์ ์ฝ๋๋ ์ ๋ฌธ์ ๋ฅผ ์ธ์ํ๊ณ while
๋ฃจํ๋ฅผ ๋ซ์ต๋๋ค.
ํ ์ผ ์ปค์(tailable cursor)์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๋งค๋ด์ผ์ ํ ์ผ ์ปค์(tailable cursor) ๊ฐ์ด๋ ๋ฅผ MongoDB Server ์ฐธ์กฐํ์ธ์.
์ถ๊ฐ ์ ๋ณด
์ฝ๊ธฐ ์์ ์ ํ์ต ๋ณด๋ ค๋ฉด ๋ฐ์ดํฐ ์กฐํ ๊ฐ์ด๋ ๋ฅผ ์ฐธ์กฐํ์ธ์.
API ๋ฌธ์
์ด ๊ฐ์ด๋์์ ์ฌ์ฉ๋๋ ๋ฉ์๋ ๋๋ ์ ํ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๋ค์ API ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ์ธ์.