2012-02-16 21 views
17

mia collezione (MongoDB v 2.0.2) ha seguenti record:query MongoDB con valore nullo

db.organization.find({}) 
{ "_id" : 1001, "path" : [ ], "parent" : null } 
{ "_id" : 1002, "path" : [ 1001 ], "parent" : NumberLong(1001) } 

organization ha indici:

db.organization.ensureIndex({"path":1}); 
db.organization.ensureIndex({"parent":1},{sparse:false}); 

(nota che ho messo awarnes sparse : false - di concedere che NULL è indicizzato) Ma, eseguendo:

db.organization.find({"parent":null}) 

Returns set vuoto. Che c'è? Grazie in anticipo

+0

Ci sono ancora problemi con questo? Puoi dare l'output di db.system.indexes.find() così come db.organization.find(). Explain()? – Barrie

+0

@Barrie, al momento non riesco a riprodurre questo errore. Sono abbastanza sicuro che sia stato raggiunto applicando più script 'js' dallo strumento da riga di comando. Quella volta che ho iniziato a 'spiegare' per riconoscere l'errore, ma ha mostrato il normale utilizzo degli indici – Dewfy

risposta

6

Appena controllato seguente script a 2.0 e 2.0.2:

db.items.insert({ "_id" : 1001, "path" : [ ], "parent" : null }) 
db.items.insert({ "_id" : 1002, "path" : [ 1001 ], "parent" : NumberLong(1001) }) 
db.items.ensureIndex({"path":1}); 
db.items.ensureIndex({"parent":1},{sparse:false}); 
db.items.find({"parent":null}) 

restituisce in realtà un documento che ci si aspetta:

{ "_id" : 1001, 
    "path" : [], 
    "parent" : null } 

Inoltre si può guardare in questo doc su querying and nulls probabilmente dovrebbe aiutarti a evitare possibili errori futuri.

+0

è un po 'magico. L'esempio con 'items' funziona, ma il mio fa schifo. – Dewfy

18

Ho avuto lo stesso problema. Dopo aver letto le seguenti documenti

Ho cercato di interrogare per i diversi tipi di elementi BSON e trovato che la mia null è stato rappresentato come un tipo di elemento BSON 6 (indefinito, obsoleto) invece dell'elemento BSON previsto, tipo 10 (null).

db.collection.find({ field: { "$type" : 6} }; 
+3

basato sul primo collegamento, penso che dovrebbe essere 'db.collection.find ({field: {" $ type ": 10}};' – AbdelHady

+1

@AbdelHady: Forse i documenti rappresentano una versione semplificata della realtà. usare '{field: {$ type: 6}}' in un 'update' dove voglio veramente dire' {field: null} '. –

+2

@AbdelHady: Scratch che, penso' {$ type: 10} ' è davvero la cosa giusta e mi sto solo confondendo –