मेरे पास सी में यह कार्यक्रम है (हैलो वर्ल्ड उदाहरण Mongo C ड्राइवर प्रलेखन में थोड़ा सा बदलाव :

#include <bson/bson.h>
#include <mongoc/mongoc.h>
#include <stdio.h>

// file insert.c
// compiled with: gcc -o insert insert.c $(pkg-config --libs --cflags libmongoc-1.0)

int main (int   argc, char *argv[])
{
    mongoc_client_t *client;
    mongoc_collection_t *collection;
    bson_error_t error;
    bson_oid_t oid;
    bson_t *doc;

    mongoc_init ();

    client = mongoc_client_new ("mongodb://localhost:27017/?appname=insert-example");
    collection = mongoc_client_get_collection (client, "mydb", "mycoll");

    doc = bson_new ();
    bson_oid_init (&oid, NULL);
    BSON_APPEND_OID (doc, "_id", &oid);
    BSON_APPEND_UTF8 (doc, "", "my_key_is_empty");

    if (!mongoc_collection_insert_one (
        collection, doc, NULL, NULL, &error)) {
    fprintf (stderr, "%s\n", error.message);
    }

    bson_destroy (doc);
    mongoc_collection_destroy (collection);
    mongoc_client_destroy (client);
    mongoc_cleanup ();

    return 0;
}

एक खाली बीएसओएन कुंजी सेट करने के लिए महत्वपूर्ण कथन यह है (जो थोड़ा अजीब है लेकिन कानूनी है):

BSON_APPEND_UTF8 (doc, "", "my_key_is_empty");

अगर मैं प्रोग्राम चलाता हूं तो मुझे यह त्रुटि मिलती है:

invalid document for insert: empty key

यह थोड़ा आश्चर्य की बात है क्योंकि अगर मैं मोंगो खोल के साथ ऐसा करने की कोशिश करता हूं, तो यह ठीक काम करता है:

> db.mycoll.insert({"": "my_key_is_empty"})
WriteResult({ "nInserted" : 1 })
> db.mycoll.find()
{ "_id" : ObjectId("60182cb49fb197394497431e"), "" : "my_key_is_empty" }

इसलिए:

  1. यह सी ड्राइवर में एक सीमा है, या
  2. मैं कुछ गलत कर रहा हूँ :)

क्या आप इसमें मेरी मदद कर सकते हैं, कृपया? धन्यवाद!

मेरे सिस्टम के बारे में कुछ अतिरिक्त जानकारी:

  • जीसीसी संस्करण: 6.3.0
  • मोंगो सी ड्राइवर संस्करण: 1.16.0
  • मोंगोडीबी संस्करण: 4.4.1
  • ऑपरेटिंग सिस्टम: डेबियन 9.3
0
fgalan 1 फरवरी 2021, 19:39

2 जवाब

सबसे बढ़िया उत्तर

कार्यक्रम का यह संस्करण इस मुद्दे को हल करता है:

include <bson/bson.h>
#include <mongoc/mongoc.h>
#include <stdio.h>

// file insert.c
// compiled with: gcc -o insert insert.c $(pkg-config --libs --cflags libmongoc-1.0)

int main (int   argc, char *argv[])
{
    mongoc_client_t *client;
    mongoc_collection_t *collection;
    bson_error_t error;
    bson_oid_t oid;
    bson_t *doc;

    mongoc_init ();

    client = mongoc_client_new ("mongodb://localhost:27017/?appname=insert-example");
    collection = mongoc_client_get_collection (client, "mydb", "mycoll");

    doc = bson_new ();
    bson_oid_init (&oid, NULL);
    BSON_APPEND_OID (doc, "_id", &oid);
    BSON_APPEND_UTF8 (doc, "", "my_key_is_empty");

    bson_t *opt = BCON_NEW("validate", BCON_BOOL(false));
    if (!mongoc_collection_insert_one (
        collection, doc, opt, NULL, &error)) {
    fprintf (stderr, "%s\n", error.message);
    }

    bson_destroy (doc);
    bson_destroy (opt);
    mongoc_collection_destroy (collection);
    mongoc_client_destroy (client);
    mongoc_cleanup ();

    return 0;
}

सत्यापन बंद करने के लिए महत्वपूर्ण हिस्सा यह है:

    bson_t *opt = BCON_NEW("validate", BCON_BOOL(false));
    if (!mongoc_collection_insert_one (
        collection, doc, opt, NULL, &error)) {
    ...
    }

    ...
    bson_destroy (opt);
0
fgalan 1 फरवरी 2021, 22:16

यह एक विशेषता प्रतीत होती है।

यह सत्यापन किया जाता है या नहीं, इसे नियंत्रित करने के लिए आप BSON_VALIDATE_EMPTY_KEYS libbson विकल्प का उपयोग कर सकते हैं।

0
D. SM 1 फरवरी 2021, 20:06