Objetos incorporados - SDK do Node.js
Nesta página
Visão geral
Um objeto embarcado é um tipo especial de objeto de Realm que modela dados complexos a respeito de um objeto específico. Os objetos incorporados são semelhantes às relações, mas fornecem restrições adicionais e mapeiam mais naturalmente o modelo de documentodesnormalizado doMongoDB.
O Realm impõe restrições de propriedade exclusivas que tratam cada objeto embarcado como dados aninhados dentro de um único objeto pai específico. Um objeto incorporado herda o ciclo de vida de seu objeto pai e não pode existir como um objeto Realm independente. Isso significa que os objetos embarcados não podem ter uma chave primária e que o Realm exclui automaticamente os objetos embarcados se o objeto pai for excluído.
Dica
Os tipos de objetos embarcados são reutilizáveis e componíveis
Você pode usar o mesmo tipo de objeto incorporado em vários tipos de objeto pai e pode incorporar objetos dentro de outros objetos incorporados. Você pode até referenciar recursivamente um tipo de objeto incorporado como uma propriedade opcional em sua própria definição.
Observação
O Realm usa exclusões em cascata para objetos embarcados
Quando você exclui um objeto de Realm, o Realm exclui automaticamente quaisquer objetos incorporados referenciados por esse objeto. Qualquer objeto que seu aplicativo precise manter após a exclusão de seu objeto pai deve usar relacionamentos.
Realm Object Models
Para definir um objeto incorporado, defina embedded
como true
. Você pode referenciar um tipo de objeto incorporado a partir de tipos de objeto principal da mesma maneira que definiria uma relação:
Importante
Objetos embarcados não podem ter uma chave primária.
const AddressSchema = { name: "Address", embedded: true, // default: false properties: { street: "string?", city: "string?", country: "string?", postalCode: "string?", }, }; const ContactSchema = { name: "Contact", primaryKey: "_id", properties: { _id: "objectId", name: "string", address: "Address", // Embed a single object }, }; const BusinessSchema = { name: "Business", primaryKey: "_id", properties: { _id: "objectId", name: "string", addresses: { type: "list", objectType: "Address" }, // Embed an array of objects }, };
JSON schema
Objetos incorporados são mapeados para documentos incorporados no esquema do tipo principal. Este comportamento difere dos objetos regulares do Realm, que mapeiam para sua própria coleção MongoDB.
{ "title": "Contact", "bsonType": "object", "required": ["_id"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "Business", "bsonType": "object", "required": ["_id", "name"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }
Ler e escrever objetos incorporados
Criar um Objeto Embarcado
Para criar um objeto embarcado, atribua uma instância do objeto embarcado à propriedade de um objeto pai:
// create an embedded address object const sydneyOrthodontics = { street: "42 Wallaby Way", city: "Sydney", country: "Australia", postalCode: "2774", }; realm.write(() => { // create a contact object realm.create("Contact", { _id: new BSON.ObjectId(), name: "Philip Sherman", address: sydneyOrthodontics, // embed the address in the contact object }); });
Atualizar uma propriedade de objeto incorporado
Para atualizar uma propriedade em um objeto integrado, modifique a propriedade em uma transação de escrita:
// Find the contact with the address you want to update const harryPotter = realm .objects("Contact") .filtered("name = 'Harry Potter'")[0]; // modify the property of the embedded object in a write transaction realm.write(() => { // update the embedded object directly through the contact harryPotter.address.street = "1 Hogwarts Ave"; });
Substituir um Objeto Integrado
Para substituir um objeto integrado, reatribua a propriedade do objeto integrado de uma parte a uma nova instância em uma transação de escrita:
// create a new address const harryNewAddress = { street: "12 Grimmauld Place", city: "London", country: "UK", postalCode: "E1 7AA", }; realm.write(() => { // overwrite the embedded object with the new address within a write transaction harryPotter.address = harryNewAddress; });
Consultar uma Coleção sobre Propriedades de Objetos Embarcados
Use a notação de ponto para filtrar ou classificar uma coleção de objetos com base em um valor de propriedade de objeto incorporado:
Observação
Não é possível consultar objetos incorporados diretamente. Em vez disso, acesse objetos incorporados por meio de uma consulta para o tipo de objeto pai.
const philipShermanAddress = realm .objects("Contact") .filtered("name = 'Philip Sherman'")[0].address.street; console.log(`Philip Sherman's address is ${philipShermanAddress}`);
Excluir um objeto incorporado
O Realm usa exclusões em cascata para objetos embarcados. Para excluir um objeto incorporado, exclua o principal do objeto incorporado.
realm.write(() => { // Deleting the contact will delete the embedded address of that contact realm.delete( realm.objects("Contact").filtered("name = 'Philip Sherman'") ); });