Working with Collections

  • how-to
    +
    The 3.x API SDKs all work with all features of Collections and Scopes.

    The Collections feature in Couchbase Server 7.x is fully implemented in the 3.x API versions of the Couchbase SDKs.

    When working with versions earlier than 7.0, the defaultcollection is used from the SDK.

    Read more about Collections and Scopes.

    Sample Application

    The Travel Sample Application has been updated with a motivating example for Collections - a multi-tenanted travel application. Imagine that we are providing a white-label Flight and Hotel booking service to multiple travel agents. Each tenant agent will get the same underlying service, but interact only with their own data.

    The travel-sample bucket has been split into Scopes for multiple tenant travel agents (for example tenant_agent_00, tenant_agent_01, …​) and a shared inventory which is further subdivided into Collections such as hotels and airports.

    Read more about the new travel-sample Data Model.

    The app is currently implemented for the following SDKs:

    Example code

    In the following example, we will use NULL for default collection, which covers the whole Bucket. To use named Collections (and Scopes), just substitute the Collection (and Scope) name for NULL.

    static void store_callback(lcb_INSTANCE *instance, int cbtype, const lcb_RESPSTORE *resp)
    {
        const char *key;
        size_t nkey;
        uint64_t cas;
        lcb_respstore_key(resp, &key, &nkey);
        lcb_respstore_cas(resp, &cas);
        printf("status: %s, key: %.*s, CAS: 0x%" PRIx64 "\n",
           lcb_strerror_short(lcb_respstore_status(resp)), (int)nkey, key, cas);
    }
    
    lcb_install_callback3(instance, LCB_CALLBACK_STORE, (lcb_RESPCALLBACK)store_callback);
    
    lcb_STATUS rc;
    lcb_CMDSTORE *cmd;
    const char *collection = NULL, *scope = NULL;
    size_t collection_len = 0, scope_len = 0;
    const char *key = "my-document";
    const char *value = "{\"name\": \"mike\"}";
    rc = lcb_cmdstore_create(&cmd, LCB_STORE_UPSERT);
    rc = lcb_cmdstore_collection(cmd, scope, scope_len, collection, collection_len);
    rc = lcb_cmdstore_key(cmd, key, strlen(key));
    rc = lcb_cmdstore_value(cmd, value, strlen(value));
    rc = lcb_store(instance, NULL, cmd);
    rc = lcb_cmdstore_destroy(cmd);
    rc = lcb_wait(instance);
    static void get_callback(lcb_INSTANCE *instance, int cbtype, const lcb_RESPGET *resp)
    {
        const char *key, *value;
        size_t nkey, nvalue;
        uint64_t cas;
        lcb_respget_key(resp, &key, &nkey);
        lcb_respget_value(resp, &value, &nvalue);
        lcb_respget_cas(resp, &cas);
        printf("status: %s, key: %.*s, CAS: 0x%" PRIx64 "\n",
           lcb_strerror_short(lcb_respget_status(resp)), (int)nkey, key, cas);
        printf("value:\n%s\n", (int)nvalue, value);
    }
    
    lcb_install_callback3(instance, LCB_CALLBACK_GET, (lcb_RESPCALLBACK)get_callback);
    
    lcb_STATUS rc;
    lcb_CMDGET *cmd;
    const char *collection = NULL, *scope = NULL;
    size_t collection_len = 0, scope_len = 0;
    const char *key = "my-document";
    rc = lcb_cmdget_create(&cmd);
    rc = lcb_cmdget_collection(cmd, scope, scope_len, collection, collection_len);
    rc = lcb_cmdget_key(cmd, key, strlen(key));
    rc = lcb_get(instance, NULL, cmd);
    rc = lcb_cmdget_destroy(cmd);
    rc = lcb_wait(instance);