Search code examples
mongodbmongo-cxx-driver

How to retrieve the value of a specific field using mongo cxx driver


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.


Solution

  • 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;
      }
    }