Get Counters Operation

This operation is used to get counters' values for a specific document.
It can be used to get the value of a single counter, multiple counters' values, or all counters' values.

Syntax

Get Single Counter

public GetCountersOperation(string docId, string counter, bool returnFullResults = false)
Parameters
docId string The ID of the document that holds the counters
counter string The name of the counter to get
returnFullResults bool A flag which indicates if the operation should include a dictionary of counter values per database node in the result

Return Full Results flag:

If RavenDB is running in a distributed cluster, and the database resides on several nodes, a counter can have a different local value on each database node, and the total counter value is the sum of all the local values of this counter from each node.
In order to get the counter values per database node, set the returnFullResults flag to true


Get Multiple Counters

public GetCountersOperation(string docId, string[] counters, bool returnFullResults = false)
Parameters
docId string The ID of the document that holds the counters
counters string[] The names of the counters to get
returnFullResults bool A flag which indicates if the operation should include a dictionary of counter values per database node in the result

Get All Counters of a Document

public GetCountersOperation(string docId, bool returnFullResults = false)
Parameters
docId string The ID of the document that holds the counters
returnFullResults bool A flag which indicates if the operation should include a dictionary of counter values per database node in the result

Return Value

The operation returns a CountersDetail object, which holds a list of CounterDetail objects

public class CountersDetail
{
    public List<CounterDetail> Counters;
}

public class CounterDetail
{
    public string DocumentId; // ID of the document that holds the counter
    public string CounterName; // The counter name
    public long TotalValue; // Total counter value
    public Dictionary<string, long> CounterValues; // A dictionary of counter values per database node
    public long Etag; // Counter Etag
    public string ChangeVector; // Change vector of the counter
}

Examples

Assume we have a document "users/1" that holds 3 counters -
"likes", "dislikes" and "downloads" - with values 10, 20 and 30 (respectively)

Example #1 : Get single counter

var operationResult = store.Operations
    .Send(new GetCountersOperation("users/1", "likes"));

Result:

{
	"Counters": 
    [
		{
			"DocumentId" : "users/1",
			"CounterName" : "likes",
			"TotalValue" : 10,
			"CounterValues" : null
		}
	]
}

Example #2 : Get multiple counters

var operationResult = store.Operations
    .Send(new GetCountersOperation("users/1", new []{"likes", "dislikes" }));

Result:

{
	"Counters": 
    [
		{
			"DocumentId" : "users/1",
			"CounterName" : "likes",
			"TotalValue" : 10,
			"CounterValues" : null
		},
        {
			"DocumentId" : "users/1",
			"CounterName" : "dislikes",
			"TotalValue" : 20,
			"CounterValues" : null
		}
	]
}

Example #3 : Get all counters

var operationResult = store.Operations
    .Send(new GetCountersOperation("users/1"));

Result:

{
	"Counters": 
    [
		{
			"DocumentId" : "users/1",
			"CounterName" : "likes",
			"TotalValue" : 10,
			"CounterValues" : null
		},
        {
			"DocumentId" : "users/1",
			"CounterName" : "dislikes",
			"TotalValue" : 20,
			"CounterValues" : null
		},
        {
			"DocumentId" : "users/1",
			"CounterName" : "downloads",
			"TotalValue" : 30,
			"CounterValues" : null
		}
	]
}

Example #4 : Include full values in the result

var operationResult = store.Operations
    .Send(new GetCountersOperation("users/1", "likes", true));

Result:

Assuming a 3-node cluster, the distribution of the counter's value to nodes A, B, and C could be as follows:

{
	"Counters": 
    [
		{
			"DocumentId" : "users/1",
			"CounterName" : "likes",
			"TotalValue" : 10,
			"CounterValues" : 
            {
                "A:35-UuCp420vs0u+URADcGVURA" : 5,
                "B:83-SeCFU29daUOxfjUcAlLiJw" : 3,
                "C:27-7i7GP8bOOkGYLNflO/rSeg" : 2,
            }
		}
	]
}