6

I'm totally new to couchbase.

This is the sample code I use for insert and get documents:

using (var bucket = Cluster.OpenBucket())
{
    var document = new Document<dynamic>
    {
        Id = "Hello",
        Content = new
        {
            name = "Couchbase"
        }
    };

    var upsert = bucket.Upsert(document);
    if (upsert.Success)
    {
        var get = bucket.GetDocument<dynamic>(document.Id);
        document = get.Document;
        var msg = string.Format("{0} {1}!", document.Id, document.Content.name);
        Console.WriteLine(msg);
    }

    Console.Read();
}

But I have no idea how to retrieve a list of stored documents.

John Saunders
  • 160,644
  • 26
  • 247
  • 397
user3530012
  • 720
  • 2
  • 20
  • 37
  • 2
    http://stackoverflow.com/questions/13068424/how-to-get-all-documents-from-the-data-bucket-using-c – Joonas Koski Jan 05 '15 at 17:21
  • do you want to obtain the exhaustive list of all keys/docs in database? or do you want to know how to retrieve several docs in one operation when you already have a list of keys? – Simon Baslé Jan 05 '15 at 17:27
  • I want to know how to retrieve several docs. for example get a list of registered users or get a list of users whose ages are older that 25. I need to retrieve each key as well. – user3530012 Jan 05 '15 at 17:31
  • 1
    ok so if you don't know the keys in advance, what you are looking for is [views](http://docs.couchbase.com/admin/admin/Views/views-intro.html). you would have to build them yourself. Joonas comment points to an answer on how to build a view that just returns all documents in the database. Note that there (soon?) will be a query language similar to SQL in couchbase (lookup N1QL)... – Simon Baslé Jan 05 '15 at 17:36

5 Answers5

17

Until now, In Couchbase there are two different ways to query document content:using Views or using N1QL query language (named nickel and in developer preview 3 state right now).

Views

Couchbase Views creates indexes based on the content of JSON documents stored in the database and are written using MapReduce programming model. Couchbase uses MapReduce to process documents across the cluster and to create indexes based on their content. A view is a JavaScript function which is executed on every item in the dataset, does some initial processing and filtering, and then outputs the transformed result as a key-value set.

The following image show you what is the structure view:

View Structure

For example, suppose that you have a bucket called test and you want to store documents with the following structure:

public  class User
    {
        [JsonProperty("user_id")]
        public string UserId { get; set; }

        [JsonProperty("fname")]
        public string FirstName { get; set; }
         
        [JsonProperty("age")]
         public string Age { get; set; }

        [JsonProperty("email")]
        public string Email { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }
}

Now, suppose that you want to find all the users who are 25 years old and you want to know their name and email. Your view could be at this way:

function(doc, meta) { 
    if (doc.type == "user" && doc.age == 25) { 
        emit(doc.user_id, [doc.fname, doc.email]); 
    } 
}

If you save this view as a Development View with Design Document Name= dev_user and View Name=userswith25, you could use this view in your code this way:

var query = bucket.CreateQuery("dev_user", "userswith25");
var result = bucket.Query<dynamic>(query);

If you want to learn more about views, take a look this video:Views and Indexing for Couchbase 3.0

N1QL

N1QL (pronounced “nickel”) is Couchbase’s next-generation query language. N1QL aims to meet the query needs of distributed document-oriented databases. A simple query in N1QL has three parts to it:

  • SELECT - Parts of document to return
  • FROM - The data bucket, or datastore to work with
  • WHERE - Conditions the document must satisfy

Only a SELECT clause is required in a query. The wildcard * selects all parts of the document. Queries can return a collection of different document structures or fragments. However, they will all match the conditions in the WHERE clause.

As I said before, N1QL is in developer preview state, so isn't integrated with Couchbase yet. [EDIT: The .NET SDK N1QL integration no longer appears to be in alpha. ] To play with it you need to download it and integrate it with your Couchbase server. Following the previous view example, I show you a query to search users with the same conditions:

var query = "SELECT fname, email FROM test WHERE type = 'user' and age = 25";
var result = bucket.Query<dynamic>(query);

Parallel to the development of N1QL, Coushbase is developing a Language Integrated Query (LINQ) provider for querying Couchbase Server with N1QL using the Couchbase .NET SDK. This will bring familiar LINQ syntax to N1QL and the results will be mapped to POCOs. Below I show an example of how you could use it in the future:

using (var cluster = new Cluster())
        {
            using (var bucket = cluster.OpenBucket("test"))
            {
                var users = from c in bucket.Queryable<User>()
                            where c.Age==25
                            select c;

                foreach (var user in users)
                {
                    Console.WriteLine("\tName={0}, Age={1}, Email={2}",
                        user.FirstName,
                        user.Age,
                        user.Email
                        );
                }
            }
        }

Also, there are other variants:

  • Telerik has created a Linq Provider for Couchbase, I haven't used yet but I think is based in Couchbase .NET SDK 1.3, not in 2.0 which is the version you are using.
  • You could integrate Couchbase with Elasticsearch to provide full-text search in your application using the open source search engine, Elasticsearch. With this combination you can save your documents in Couchbase and search them later using Elasticsearch. For that, you can use this elasticsearch .net client

Hope this helps.

Community
  • 1
  • 1
ocuenca
  • 38,548
  • 11
  • 89
  • 102
2

I concur with Simon as well. Views to find the keys or N1QL. If you have not yet setup or interacted with N1QL, it is a very powerful language and a tutorial can be found here:

http://docs.couchbase.com/developer/n1ql-dp3/n1ql-intro.html

Austin Gonyou
  • 252
  • 2
  • 5
1

To find keys that meet a criteria, there's views (and N1QL upcoming) as seen in others responses.

The other use case is, having a list of keys, to retrieve the corresponding documents without using a loop:

On the bucket, you can use IDictionary<string, IOperationResult<T>> Get<T>(IList<string> keys) method. It takes the list of keys you want to get and returns one IOperationResult per key in a dictionary, each of which you can use like you used the "get" variable in your example.

Under the wire, this uses the TPL so there's no need for you to work on parallelism, but you can provide parallelism settings in overrides.

Here is some documentation on bulk operations with the 2.0 .Net SDK. Should be relevant even though this is documentation for the BETA.

Note: the usage of views generally gives you the id / content of the index, but also the associated document, so when using views you shouldn't even have to do a bulk get.

Simon Baslé
  • 27,105
  • 5
  • 69
  • 70
0

Please note that N1QL is a query language and needs to work along with views in order to scan and retrieve all the keys from couchbase server. N1QL allows you to create a primary index on your dataset (using views) and then use that index to run your queries.

After you install and setup N1QL the following example query will create a view index/primary index on the couchbase server

Create primary index on bucket;

Once the index is created then you can retrieve all the keys from the server.

*select * from bucket;

Internally the query engine will use the view/primary index to fetch a list of keys of the server (full bucket scan) and then use that list to retrieve the values.

Manik Taneja
  • 114
  • 1
  • 8
0

N1QL Developer previews must use views. Your syntax of create index is accurate, but Couchbase 4.0 is also introducing secondary indexes and the ability to scale query and index capabilities dynamically. When this happens, called "Multi-Dimensional Scaling", N1QL should default to the new indexes as the primary indexing scheme, and much much faster than views.

More can be read about multi-dimensional scaling here:

http://www.couchbase.com/coming-in-couchbase-server-4-0

Austin Gonyou
  • 252
  • 2
  • 5