Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Menu Docs
Página inicial do Docs
/ /
Tipos de dados

Misto - React Native SDK

Alterado na versão realm@12.9.0: Propriedades mistas podem conter listas ou dicionários de dados mistos.

Novidades na versão realm@10.5.0.

O tipo de dados misto é um tipo de propriedade Realm que pode conter qualquer tipo de dados Realm válido, exceto um objeto incorporado ou um conjunto. Você pode criar collections (listas, conjuntos e dicionários) do tipo mixed. Propriedades que usam o tipo de dados misto também podem conter valores nulos.

O tipo Misto é indexável, mas você não pode usá-lo como chave primária.

As propriedades que usam o tipo Misto podem conter valores nulos e não podem ser definidas como opcionais. Todas as instâncias do tipo JavaScript Number em um tipo Realm Misto são mapeadas para o tipo Realm double .

Para definir uma propriedade do seu Realm Object Model como Misto, defina o tipo da propriedade como mixed.

class Cat extends Realm.Object {
static schema = {
name: 'Cat',
properties: {
name: 'string',
birthDate: 'mixed',
},
};
}
class Cat extends Realm.Object<Cat> {
name!: string;
birthDate?: Realm.Mixed;
static schema: ObjectSchema = {
name: 'Cat',
properties: {
name: 'string',
birthDate: 'mixed',
},
};
}

No JavaScript SDK v12.9.0 e posterior, um tipo de dados misto pode conter collections (uma lista ou dicionário, mas não um conjunto) de elementos mistos. Você pode usar collections mistas para modelar dados não estruturados ou variáveis. Para mais informações, consulte Definir Dados Não Estruturados.

  • Você pode aninhar collections mistas em até 100 níveis.

  • Você pode consultar propriedades de collections mistas e registrar um ouvinte para alterações, como faria com uma collection normal.

  • Você pode encontrar e atualizar elementos individuais de collections mistas

  • Você não pode armazenar conjuntos ou objetos incorporados em coleções mistas.

Para utilizar coleções mistas, defina a propriedade de tipo misto no seu modelo de dados. Em seguida, crie a lista ou coleção de dicionário.

Crie um objeto com um valor misto usando o operador dentro de uma transação de gravação.

No exemplo CreateCatsInput seguinte, criamos vários Objeto de Realm Cat com um tipo Misto para o campo birthDate .

O componente CreateCatsInput faz o seguinte:

  • Obter acesso a uma instância de realm aberta chamando a função hook useRealm().

  • Use o gancho useEffect da React para chamar uma função anônima somente uma vez com useEffect e uma array de dependência vazia.

  • Na função anônima, criamos quatro objetos Cat diferentes usando o operador new para criar um novo objeto de Realm em uma transação de gravação. Cada um dos Cat objetos utiliza um tipo de dados diferente para a propriedade birthDate .

  • Use o hook useQuery() para recuperar todos os objetos Cat .

  • Map Mapeie os gatos para renderizar uma lista de componentes do Text exibindo name e birthDate de cada fetivo.

1const CreateCatsInput = () => {
2 const realm = useRealm();
3
4 useEffect(() => {
5 // Add data to the Realm when the component mounts
6 realm.write(() => {
7 // create a Cat with a birthDate value of type string
8 realm.create('Cat', {
9 name: 'Euler',
10 birthDate: 'December 25th, 2017',
11 });
12
13 // create a Cat with a birthDate value of type date
14 realm.create('Cat', {
15 name: 'Blaise',
16 birthDate: new Date('August 17, 2020'),
17 });
18
19 // create a Cat with a birthDate value of type int
20 realm.create('Cat', {name: 'Euclid', birthDate: 10152021});
21
22 // create a Cat with a birthDate value of type null
23 realm.create('Cat', {name: 'Pythagoras', birthDate: null});
24 });
25 }, []);
26
27 // retrieve all cats
28 const cats = useQuery(Cat);
29
30 return (
31 <>
32 {cats.map(cat => (
33 <View>
34 <Text>{cat.name}</Text>
35 <Text>{String(cat.birthDate)}</Text>
36 </View>
37 ))}
38 </>
39 );
40};
1const CreateCatsInput = () => {
2 const realm = useRealm();
3
4 useEffect(() => {
5 // Add data to the Realm when the component mounts
6 realm.write(() => {
7 // create a Cat with a birthDate value of type string
8 realm.create('Cat', {
9 name: 'Euler',
10 birthDate: 'December 25th, 2017',
11 });
12
13 // create a Cat with a birthDate value of type date
14 realm.create('Cat', {
15 name: 'Blaise',
16 birthDate: new Date('August 17, 2020'),
17 });
18
19 // create a Cat with a birthDate value of type int
20 realm.create('Cat', {name: 'Euclid', birthDate: 10152021});
21
22 // create a Cat with a birthDate value of type null
23 realm.create('Cat', {name: 'Pythagoras', birthDate: null});
24 });
25 }, []);
26
27 // retrieve all cats
28 const cats = useQuery(Cat);
29
30 return (
31 <>
32 {cats.map(cat => (
33 <View>
34 <Text>{cat.name}</Text>
35 <Text>{String(cat.birthDate)}</Text>
36 </View>
37 ))}
38 </>
39 );
40};

Para consultar objetos com um valor Misto, execute o método Collection.filtered() e passar um filtro para um campo não misto. Em seguida, você pode imprimir o valor da propriedade Mixed ou de todo o objeto .

No exemplo CatInfoCard a seguir, fazemos uma query para um objeto Cat usando o nome do cão.

O componente CatInfoCard faz o seguinte:

  • Obtenha todos os objetos Cat passando a classe Cat para o gancho useQuery() e, em seguida, use filtered() para filtrar os resultados para receber somente os gatos cujos nomes correspondem ao nome passado como um suporte. Em seguida, obtemos o primeiro cão correspondente e o armazenamos como uma variável constante.

  • Use a notação de ponto para recuperar a propriedade Misto, birthDate.

  • Exiba o nome e a data de nascimento do cão no método de renderização se o Realm encontrar o cão. Se não houver nenhum cão que corresponda ao nome passado ao componente como suporte, renderizamos o texto "Gato não encontrado".

1const CatInfoCard = ({catName}) => {
2 // To query for the cat's birthDate, filter for their name to retrieve the realm object.
3 // Use dot notation to access the birthDate property.
4 const cat = useQuery(
5 Cat,
6 cats => {
7 return cats.filtered(`name = '${catName}'`);
8 },
9 [catName],
10 )[0];
11 const catBirthDate = cat.birthDate;
12
13 if (cat) {
14 return (
15 <>
16 <Text>{catName}</Text>
17 <Text>{String(catBirthDate)}</Text>
18 </>
19 );
20 } else {
21 return <Text>Cat not found</Text>;
22 }
23};
1type CatInfoCardProps = {catName: string};
2
3const CatInfoCard = ({catName}: CatInfoCardProps) => {
4 // To query for the cat's birthDate, filter for their name to retrieve the realm object.
5 // Use dot notation to access the birthDate property.
6 const cat = useQuery(
7 Cat,
8 cats => {
9 return cats.filtered(`name = '${catName}'`);
10 },
11 [catName],
12 )[0];
13 const catBirthDate = cat.birthDate;
14
15 if (cat) {
16 return (
17 <>
18 <Text>{catName}</Text>
19 <Text>{String(catBirthDate)}</Text>
20 </>
21 );
22 } else {
23 return <Text>Cat not found</Text>;
24 }
25};

Como as propriedades mistas podem ser mais de um tipo, você não pode confiar em que o valor da propriedade seja de um tipo específico.

Com Object.getPropertyType(), você pode obter o tipo subjacente de uma propriedade Misto. Isso permite que você crie sua própria verificação de tipo.

// Use Type Predicates and Object.getPropertyType() to
// create a runtime type check for Mixed properties.
const isString = (
val: Mixed,
name: string,
object: Realm.Object,
): val is Realm.Types.String => {
return object.getPropertyType(name) === 'string';
};
type CatInfoCardProps = {catName: string};
const CatInfoCard = ({catName}: CatInfoCardProps) => {
const cat = useQuery(
Cat,
cats => {
return cats.filtered(`name = '${catName}'`);
},
[catName],
)[0];
// Use the type check to handle your data.
const catBirthDate = isString(cat.birthDate, 'birthDate', cat)
? cat.birthDate
: cat.birthDate.toString();
if (cat) {
return (
<>
<Text>{catName}</Text>
<Text>{catBirthDate}</Text>
</>
);
} else {
return <Text>Cat not found</Text>;
}
};

Voltar

Conjuntos

Nesta página