Novidades na versão 12.10.0.
O Atlas Device SDK para Node.js oferece uma classe Contador que você pode usar como contador lógico ao trabalhar com bancos de dados sincronizados. Tradicionalmente, você armazenaria um valor de contador e o leria, incrementaria e definiria manualmente. No entanto, se vários clientes tentarem atualizar o contador, isso poderá resultar em um valor subjacente impreciso para todos os clientes.
Considere um cenário em que um Objeto de Realm tenha uma propriedade count do tipo int. Os dispositivos A e B leem o valor como 0 e, em seguida, incrementam a contagem adicionando 1 ao valor de leitura. Em vez de refletir os incrementos de ambos os dispositivos e convergir para 2, o valor subjacente é apenas 1.
A classe Counter torna possível sincronizar essas atualizações para que o valor converja para o mesmo valor subjacente em todos os clientes.
O counter do SDK é um tipo de dados de apresentação com um tipo subjacente de int. Isso significa que nenhuma migração é necessária ao alterar um tipo int para counter.
Contadores não podem ser usados como:
Definir uma propriedade de contador
Para usar a classe Counter , declare uma propriedade em seu Objeto de Realm como tipo Counter.
Opcionalmente, você pode declarar essa propriedade como anulável, tornando-a opcional e passando Counter e null como tipos. Com um contador anulável, você pode definir a propriedade do contador dentro do seu objeto de Realm como null , conforme necessário.
A propriedade é inicializada usando:
Notação de objeto
{ type: "int", presentation: "counter" }{ type: "int", presentation: "counter", optional: true }
Estenografia
"counter""counter?"
export class ClassWithCounter extends Realm.Object { static schema = { name: "ClassWithCounter", primaryKey: "_id", properties: { _id: { type: "objectId", default: () => new BSON.ObjectId() }, myCounter: { type: "int", presentation: "counter" }, // or myCounter: "counter" nullableCounter: { type: "int", presentation: "counter", optional: true }, // or nullableCounter: "counter?" }, }; }
export class ClassWithCounter extends Realm.Object<ClassWithCounter> { _id!: BSON.ObjectId; myCounter!: Counter; nullableCounter?: Counter | null; static schema: ObjectSchema = { name: "ClassWithCounter", primaryKey: "_id", properties: { _id: { type: "objectId", default: () => new BSON.ObjectId() }, myCounter: { type: "int", presentation: "counter" }, // or myCounter: "counter" nullableCounter: { type: "int", presentation: "counter", optional: true }, // or nullableCounter: "counter?" }, }; }
Criar e atualizar um contador
Para inicializar um contador, crie seu objeto usando o método realm.create() . Passe seu esquema de objetos de Realm e o valor inicial do contador, bem como os valores iniciais para quaisquer outras propriedades que o objeto tenha.
const siteVisitTracker = realm.write(() => { return realm.create(SiteVisitTracker, { siteVisits: 0 }); });
Você pode então usar os seguintes métodos para modificar o valor do contador:
increment()edecrement()atualizam o valor subjacente por um número especificado.set()reatribui o contador a um valor especificado.
siteVisitTracker.siteVisits.increment(); siteVisitTracker.siteVisits.value; // 1 siteVisitTracker.siteVisits.increment(2); siteVisitTracker.siteVisits.value; // 3 siteVisitTracker.siteVisits.decrement(2); siteVisitTracker.siteVisits.value; // 1 siteVisitTracker.siteVisits.increment(-2); siteVisitTracker.siteVisits.value; // -1 siteVisitTracker.siteVisits.set(0); // reset counter value to 0
Aviso
Redefinições do contador
Tenha cuidado ao usar set(), pois ele substitui quaisquer chamadas anteriores para increment() e decrement(). Dependendo da ordem das operações, isso pode resultar na convergência do contador para um valor diferente. Para evitar valores de contador imprecisos entre clientes, recomendamos que você evite misturar set() com increment() e decrement().
Para atualizar um contador anulável, para ou de um valor null , você deve usar realm.create() com um UpdateMode especificado. Em vez de atualizar o valor do contador subjacente, isto define a propriedade do contador como nulo ou para um novo contador.
UpdateMode atualiza qualquer objeto de Contador existente com uma chave primária correspondente, de acordo com o modo especificado:
UpdateMode.Allatualiza todas as propriedades fornecidas.UpdateMode.Modifiedatualiza apenas propriedades modificadas.
const siteVisitTracker = realm.write(() => { return realm.create(SiteVisitTracker, { nullableSiteVisits: 0, siteVisits: 1, }); }); const myID = siteVisitTracker._id; realm.write(() => { realm.create( SiteVisitTracker, { _id: myID, nullableSiteVisits: null }, UpdateMode.Modified ); }); realm.write(() => { realm.create( SiteVisitTracker, { _id: myID, nullableSiteVisits: 0 }, UpdateMode.Modified ); });
Valores de contador de query
Você pode consultar propriedades do contador como outros tipos de propriedade . No entanto, para fazer query pelo valor do contador subjacente, você deve passar o counter.value em uma query parametrizada. No exemplo a seguir, queremos encontrar todos os objetos com um valor de contador maior ou igual ao do contador especificado.
const belowThreshold = realm.write(() => { return realm.create(SiteVisitTracker, { siteVisits: 0 }); }); const atThreshold = realm.write(() => { return realm.create(SiteVisitTracker, { siteVisits: 1 }); }); const aboveThreshold = realm.write(() => { return realm.create(SiteVisitTracker, { siteVisits: 2 }); }); const allObjects = realm.objects("SiteVisitTracker"); let filteredObjects = allObjects.filtered( "siteVisits >= $0", atThreshold.siteVisits.value );
Para obter mais informações sobre query com o SDK, consulte RQL.