Say, I inserted the following document using the mongo command line or shell:
db.Users.insert(
{
"user info":{
"user name" : "Joe",
"password" : "!@#%$%" ,
"Facebook" : "aaa",
"Google" : "joe z"
}
}
)
Then this entry is logged into the database with a system created ID.
If I want to achieve the following command line which only returns the value of a specific filed (_id in this case), using the cxx driver how should I do it?
Here is the command line:
db.Users.find({"user info.user name": "Joe"}, {"_id":1})
I tried the following C++ code
bsoncxx::builder::stream::document document{} ;
document<<"user info.user name"<<"Joe"<<"_id"<<1;
auto cursor = myCollection.find(document.view());
for (auto && doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
It simply give me nothing.
If I set
document<<"user info.user name"<<"Joe"
Then it returns the entire JSON message for me.
Please let me know if you have any better ideas.
Here's an example:
#include <iostream>
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/options/find.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>
using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::open_document;
using bsoncxx::builder::stream::close_document;
using bsoncxx::builder::stream::finalize;
int main(int, char **) {
mongocxx::instance inst{};
mongocxx::client conn{mongocxx::uri{}};
auto coll = conn["test"]["foo"];
coll.drop();
// Insert a test document
auto joe = document{} << "user info" << open_document << "user name"
<< "Joe" << close_document << finalize;
auto result = coll.insert_one(joe.view());
std::cout << "Inserted " << result->inserted_id().get_oid().value.to_string()
<< std::endl;
// Create the query filter
auto filter = document{} << "user info.user name"
<< "Joe" << finalize;
// Create the find options with the projection
mongocxx::options::find opts{};
opts.projection(document{} << "_id" << 1 << finalize);
// Execute find with options
auto cursor = coll.find(filter.view(), opts);
for (auto &&doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
}