2014-12-08 11 views
14

vedo tre possibilità principali per memorizzare le informazioni booleano in MongoDB:Come dovrei memorizzare i valori booleani in mongodb?

  1. 0 o 1 come stringa
  2. 0 o 1 come numero
  3. True o False come un valore booleano

Quali sono i vantaggi/svantaggi di ciascun metodo in termini di spazio di archiviazione utilizzato e velocità delle query?

+3

Perché dovresti usare _anything_ diverso da un valore booleano ('true' /' false')? –

+0

wellllllllllllllllllll. a corto di dire è un trucco o scherzetto. si può trattare un valore nullo o non definito come -1 contrario a vero/falso. quindi un numero. ma si possono trovare valori non definiti usando $ esiste in mongodb. quindi nessun vantaggio. eccetto che è possibile indicizzare undefined .... –

risposta

23

Boolean è un tipo di campo nativo in BSON (il formato di archiviazione sul lato server di MongoDB, noto anche come "JSON binario"). I booleani utilizzano meno spazio di archiviazione di un intero o di una stringa ed evitano effetti collaterali imprevisti di confronto.

Ad esempio, in un MongoDB find() richiesta una stringa di "1" sarà non corrisponda a un valore numerico di 1 o un valore booleano di true. Se vuoi memorizzare valori booleani, usa sicuramente un tipo booleano.

Confrontando le dimensioni BSON (in byte) nella mongo coperture per completezza:

// Number (JavaScript double) - 8 bytes 
> var foo = { a: 1 } 
> Object.bsonsize(foo) 
16 

// UTF-8 String - 6 bytes 
> var foo = { a: '1'} 
> Object.bsonsize(foo) 
14 

// 32-bit int - 4 bytes 
> var foo = { a: NumberInt(1)} 
> Object.bsonsize(foo) 
12 

// Boolean - 1 byte 
> var foo = { a: true} 
> Object.bsonsize(foo) 
9 

Nota: la dimensione base dell'oggetto JSON negli esempi sopra (senza contare i valori di campo) è di 8 byte, quindi la differenza tra Object.bsonsize() è la rappresentazione del valore del campo.

0

Se si dispone di un paio di valori booleani, potrebbe essere opportuno utilizzare il valore booleano incorporato in BSON. Ma come visto sotto, le dimensioni di ogni booleano sono 4 byte. Quindi, se i tuoi dati sono molto piccoli (rispetto ai 4 byte in più) e/o hai molti booleani, è meglio usare un bitmap intero con le operazioni bitwise.

> var foo = {} 
> Object.bsonsize(foo) 
5 
> foo.a = true 
true 
> Object.bsonsize(foo) 
9 
> foo.b = true 
true 
> Object.bsonsize(foo) 
13 
+0

Come notato nella mia risposta, la dimensione BSON dell'oggetto base è di 8 byte (incluso un nome di campo di un singolo carattere, ma non i valori); un valore booleano è 1 byte. Puoi certamente inserire più booleani in un singolo valore intero usando le maschere di bit, ma questo scambia l'efficienza dell'indice e la leggibilità dello schema per un potenziale risparmio di pochi byte. Come in MongoDB 3.4, le query di maschera di bit non possono usare indici (upvote/watch [SERVER-24749] (https://jira.mongodb.org/browse/SERVER-24749)), quindi si consigliano valori booleani se si prevede di includerli campi in un indice. – Stennie

Problemi correlati