Conventions

Conventions give you the ability to customize the Client API behavior. They are accessible from DocumentStore object:

const store = new DocumentStore();
const conventions = store.conventions;

// customizations go here

store.initialize();

You will find many settings to overwrite, allowing you to adjust the client according to your needs. The conventions apply to many different client behaviors. Some of them are grouped and described in the separate articles of this section.

Information

All customizations need to be set before DocumentStore.initialize() is called.

MaxHttpCacheSize

If you need to modify the maximum http cache size, you can use the following setting:

conventions.maxHttpCacheSize = 256 * 1024 * 1024;

Default size

The default value of this setting is configured to 128 MB.

The cache is created per database you use.

Disable caching

To disable the caching globally you can set the maxHttpCacheSize value to zero:

conventions.maxHttpCacheSize = 0;

In this scenario, all the requests will be sent to the server to fetch the data.

MaxNumberOfRequestsPerSession

Gets or sets maximum number of GET requests per session. Default: 30.

conventions.maxNumberOfRequestsPerSession = 10;

UseOptimisticConcurrency

Controls whether optimistic concurrency is set to true by default for all future sessions. Default: false.

conventions.useOptimisticConcurrency = true;

DisableTopologyUpdates

Forces you to disable updates of database topology. Default: false.

conventions.disableTopologyUpdates = false;

UseCompression

It determines if the client will send headers to the server indicating that it allows compression to be used. Default: true.

conventions.useCompression = true;

Changing fields/properties naming convention

By default whatever casing convention you use in your entities' fields will be reflected server-side.

If following language-specific field casing conventions RavenDB clients use different field/properties naming conventions:

Language Default convention Example
C# PascalCase OrderLines
Java camelCase orderLines
JavaScript camelCase orderLines

This can be configured to allow inter-language operability e.g. store data PascalCase, but keep fields in the application code camelCase.

Example: storing data PascalCase, have camelCase in application entities

If you'd like to transform field names to be PascalCase server-side, but keep using camelCase in your Node.js application. You need to set 2 properties (since JS is not aware of local classes/objects field names):

  • conventions.remoteEntityFieldNameConvention - for transforming data before it's sent to the server

  • conventions.entityFieldNameConvention - for transforming data once it's loaded from the server

You have to set property naming strategy:

conventions.remoteEntityFieldNameConvention = "pascal";
conventions.entityFieldNameConvention = "camel";

Dates storage conventions

By default all dates are stored in local time with no timezone information. There are 2 document conventions allowing to adjust storage of dates:

  • store.conventions.storeDatesWithTimezoneInfo
  • store.conventions.storeDatesInUtc

StoreDatesWithTimezoneInfo

This convention allows you to store dates along with the timezone information, by storing dates in the following format: YYYY-MM-DDTHH:mm:ss.SSS0000Z. JavaScript's Date object's minimal precision is 1 ms, hence the zeroes in the date format for the nanoseconds. Default: false.

conventions.storeDatesWithTimezoneInfo = true;

StoreDatesInUtc

If enabled, dates are going to be stored in UTC instead of local time. Default: false.

conventions.storeDatesInUtc = true;

Entity types registration - registerEntityType()

Type information about the entity and its contents is by default stored in the document metadata. Based on that its types are revived when loaded from the server. Conventions object exposes a method registerEntityType(type) allowing you to register types of your entities and their subobjects in order to:

  • revive object types when loading from the server

  • avoid passing documentType argument every time on methods loading entites e.g. load(), query() etc.

Entity type registration

To avoid passing documentType argument every time, you can register the type in the document conventions using the registerEntityType() method before calling DocumentStore's initialize() like so:

class Pet {
    constructor(name) {
        this.name = name;
    }
}

class Person {
    constructor(name, pet) {
        this.name = name;
        this.pet = pet;
    }
}

documentStore.conventions.registerEntityType(Person);
documentStore.conventions.registerEntityType(Pet);
// ...

documentStore.initialize();

If you fail to do so, entities (and all subobjects) loaded from the server are going to be plain object literals and not instances of the original type they were stored with.

Storing object literals - findCollectionNameForObjectLiteral()

In order to comfortably use object literals as entities set the function getting collection name based on the content of the object - store.conventions.findCollectionNameForObjectLiteral()

const store = new DocumentStore(urls, database);
store.conventions.findCollectionNameForObjectLiteral = entity => entity["collection"];
// ...
store.initialize();

If you fail to do so, your object literal based entites will land up in @empty collection having an UUID for an ID.