MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak rekursywnie generować dokumenty Mongodb za pomocą sterownika mongocxx c++?

Trudno mieć pewność, nie widząc kontekstu opublikowanego segmentu, ale wygląda na to, że napotkany problem dotyczy typu wyjściowego << operatora w konstruktorze strumienia. W rzeczywistości konstruktor strumienia ma błędną nazwę; nie jest to „strumień” w typowym dla C++ znaczeniu tego słowa, jako typ wyjściowy << operator będzie czasem inny niż operand po lewej stronie. W szczególności, gdy używasz czegoś takiego jak open_document lub close_document , typ, który wyprowadza wyrażenie, będzie inny niż operand po lewej stronie. Z tego powodu zazwyczaj będziesz musiał przechowywać dane wyjściowe jednego z tych wyrażeń.

Ze względu na zamieszanie, które często powoduje konstruktor strumieni w takich przypadkach, ogólnie lepiej jest zamiast tego używać podstawowego konstruktora. Podczas gdy podstawowa składnia konstruktora jest nieco bardziej szczegółowa, znacznie trudniej jest popełnić w niej subtelny błąd, a gdy popełnisz błąd, komunikaty o błędach kompilatora są znacznie łatwiejsze do zrozumienia.

Oto jak zbudować ten sam dokument za pomocą podstawowego kreatora:

#include <bsoncxx/builder/basic/document.hpp>
#include <bsoncxx/builder/basic/kvp.hpp>
#include <bsoncxx/builder/basic/sub_document.hpp>

using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::sub_document;

bsoncxx::builder::basic::document doc;

// Build the document
doc.append(kvp("MainType", [](sub_document sub_doc1) {
    sub_doc1.append(kvp("TLSRecord", [](sub_document sub_doc2) {
        sub_doc2.append(kvp("type", "16"),
                        kvp("version", "0301"),
                        kvp("length", "012C"),
                        kvp("hsMsg", [](sub_document sub_doc3) {
                            sub_doc3.append(kvp("type", "01"),
                                            kvp("length", "000128"),
                                            kvp("clientHello", [](sub_document sub_doc4) {
                                                sub_doc4.append(
                                                    kvp("version", "0303"),
                                                    kvp("random", "40C70E243001B96D8C"),
                                                    kvp("session_id_length", ""));
                                            }));
                        }));
    }));
}));

// Get a view of the document being built and do something with it.
do_something_with_document_view(doc.view());

// Extract the document from the builder and do something with it.
do_something_with_owned_document(doc.extract());

bsoncxx::builder::basic::document::append przyjmuje dowolną liczbę kvp 's (par klucz-wartość) i dołącza je do konstruktora. W przypadku typów podstawowych, takich jak ciągi, możesz po prostu przekazać wartość jako drugi argument. Aby zbudować poddokument, użyj lambda jako drugiego argumentu, który przyjmuje bsoncxx::builder::basic::sub_document a następnie dołącz do tego kreatora poddokumentów w ten sam sposób.

Aby pobrać dokument z kreatora, możesz użyć view() lub extract() metody. view() zwraca bsoncxx::document::view() , który jest widokiem dokumentu bez właściciela; budowniczy musi pozostać przy życiu przez cały czas korzystania z widoku. extract() zwraca bsoncxx::document::value, która jest wartością posiadaną; kiedy extract() zostanie wywołany, budowniczy zostanie zresetowany do stanu pustego.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sesje Django

  2. Integralność danych MongoDB

  3. mongoengine +django jak policzyć ilość elementów o tej samej treści

  4. jak znaleźć wyraźne pole modelu na i kondycji w manguście?

  5. Jak zamienić ciąg we wszystkich dokumentach w Mongo