2013-08-04 12 views
18

Sto provando a interrogare il mio database per prezzi superiori o inferiori a un numero specificato dall'utente. Nel mio databse, i prezzi sono memorizzati in questo modo:

{price: "300.00"} 

Secondo la documentazione, questo dovrebbe funzionare:

db.products.find({price: {$gt:30.00}}).pretty() 

ma ottengo risultati restituiti. Ho anche provato {price: {$gt:30}}.

Cosa mi manca qui?

Perché i prezzi vengono memorizzati come una stringa anziché come un numero nel DB? C'è un modo per aggirare questo?

risposta

19

Se si intende utilizzare $ gt con stringhe, sarà necessario utilizzare regex, il che non è eccezionale in termini di prestazioni. È più semplice creare un nuovo campo che contenga il valore numerico del prezzo o modificare questo tipo di campo in int/double. Una versione javascript dovrebbe funzionare anche così:

db.products.find("this.price > 30.00") 

come js lo convertirà in numero prima dell'uso. Tuttavia, gli indici non funzioneranno su questa query.

+0

Woah, non avevo idea di poter usare javascript nella query. Fantastico, grazie. Lo convertirò comunque in un numero, ma questo aiuta molto. – Jascination

+0

Si desidera che il prezzo sia int solo @Jascination l'esecuzione JS non utilizzerà indice, in quanto è praticamente inutile in questo caso, è più semplice rendere lo schema corretto – Sammaye

+2

Si prega di evitare $ dove, viene eseguito in JavaScript e dà un grande successo nelle prestazioni. $ gt può essere utilizzato anche con altri tipi. – Derick

14

$gt è un operatore in grado di funzionare su qualsiasi tipo:

db.so.drop(); 
db.so.insert({ name: "Derick" }); 
db.so.insert({ name: "Jayz" }); 
db.so.find({ name: { $gt: "Fred" } }); 

Returns:

{ "_id" : ObjectId("51ffbe6c16473d7b84172d58"), "name" : "Jayz" } 

Se si vuole confrontare con un numero con $gt o $lt, allora il valore nel documento deve anche essere un numero. I tipi in MongoDB sono rigidi e fanno non auto-convertiti come se f.e. farebbe in PHP. Al fine di risolvere il problema, assicurarsi di memorizzare i prezzi a partire da numeri (galleggianti o interi):

db.so.drop(); 
db.so.insert({ price: 50.40 }); 
db.so.insert({ price: 29.99 }); 
db.so.find({ price: { $gt: 30 } }); 

Ritorni:

{ "_id" : ObjectId("51ffbf2016473d7b84172d5b"), "price" : 50.4 } 
+0

Ottima risposta, grazie! – Rijk

Problemi correlati