2012-04-03 12 views
5

Quando eseguire la seguente query:

db.users.find({"pic.status" : {$ne : null} }, {"pic" : 1}).toArray() 

mi aspetto di ricevere tutti gli utenti il ​​cui pic.status non è nulla. Tuttavia, il risultato effettivo è simile al seguente:

{                                  
    "_id" : ObjectId("4f1e1ab9cdf9dbaa160000bf"), 
    "pic" : { 
     "id" : "4f1e1ab9cdf9dbaa160000be",                                                                              
     "status" : null 
    } 
}, 
{ 
    "_id" : ObjectId("4f1e28480eaf38193d00006f"), 
    "pic" : { 
     "id" : "4f1e28480eaf38193d00006e",                                                                              
     "status" : null 
    } 
} 

Cioè, ricevo utenti il ​​cui pic.status è nullo. Come posso risolvere questo?

risposta

2

Non riesco a riprodurre questo. Quale versione di Mongo stai usando? (Sto usando 2.1.1-pre) Ecco i passaggi che ho seguito. Il seguente è dalla shell JS:

> db.users.save({                                  
    "_id" : 1, 
    "pic" : { 
     "id" : "4f1e1ab9cdf9dbaa160000be",                                                                              
     "status" : null 
    } 
}); 
> db.users.save({ 
    "_id" : 2, 
    "pic" : { 
     "id" : "4f1e28480eaf38193d00006e",                                                                              
     "status" : null 
    } 
}); 
> db.users.save({ 
    "_id" : 3, 
    "pic" : { 
     "id" : "4f1e28480eaf38193d00006e",                                                                              
     "status" : "Something" 
    } 
}); 
> db.users.find({"pic.status":{$ne:null}}, {pic:1}).toArray() 
[ 
    { 
     "_id" : 3, 
     "pic" : { 
      "id" : "4f1e28480eaf38193d00006e", 
      "status" : "Something" 
     } 
    } 
] 

Solo il documento contenente "pic.status": "Qualcosa" viene restituito.

Il mio unico pensiero è, sei assolutamente certo che il valore di (null) nella query è lo stesso di quello che viene salvato nei documenti? I documenti sono stati salvati utilizzando la shell JS oppure sono stati salvati utilizzando un driver in una lingua diversa? Teoricamente, null, dovrebbe essere nullo, dovrebbe essere nullo, in qualsiasi lingua, ma so che linguaggi diversi rappresentano "nessun valore" in modo diverso. Ad esempio, in python il valore per "nessun valore" è (Nessuno). (null) non è riconosciuto in python.

In un guscio pitone, ho tentato di salvare un documento con (null) come valore, ma ha ricevuto un errore:

In [13]: coll.save({"_id":5, "pic":{"id":5, "status":null}}) 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
/Users/mbastien/mongodb-osx-x86_64-2.0.1/bin/<ipython-input-13-1ad232456c88> in <module>() 
----> 1 coll.save({"_id":5, "pic":{"id":5, "status":null}}) 

NameError: name 'null' is not defined 

Ho poi inserito (con il guscio Python) uno stato di 'nullo' ('nullo' essere una stringa)

In [15]: coll.save({"_id":5, "pic":{"id":5, "status":'null'}}) 
Out[15]: 5 

Non sorprendentemente, quando reran la query nel guscio JS, questo documento è stato restituito, perché 'nullo'! = null

> db.users.find({"pic.status":{$ne:null}}, {pic:1}).toArray() 
[ 
    { 
     "_id" : 3, 
     "pic" : { 
      "id" : "4f1e28480eaf38193d00006e", 
      "status" : "Something" 
     } 
    }, 
    { 
     "_id" : 5, 
     "pic" : { 
      "status" : "null", 
      "id" : 5 
     } 
    } 
] 

È simile a quello che stai vivendo o puoi riprodurre questo 100% nella shell JS? Speriamo che saremo in grado di arrivare alla radice di questo problema!

+0

Volevo solo dire che sono stato in grado di "riprodurlo" nella mia installazione. Stavo usando mapReduce per generare una collezione. Quando eseguo: 'db.analysis.find ({'value.ds': {$ exists: true}, 'valore.ds ': {$ ne: null}}) 'Sono stato accolto con ' {"_id": "", "valore": {"ds": null, "ro": null}} {"_id ": "00003262a3a6c8b50b470f4021812aef13e079a89756dcafbc5efa1168632548", "valore": { "DS": null, "ro": null}} { "_id": "0000ddd5f3845f44631651719c846c42dffe7001816c53a7aa8814b1d61c1017", "valore": { "DS": null, "ro": null }} ' – awshepard

+0

Il problema è andato via dopo aver reinstallato Mongo. Non sono sicuro di cosa potrebbe averlo causato. Sono sicuro che era un valore nullo corretto, ma grazie per la risposta Marc. Il tuo primo esempio funziona perfettamente per me ora. –

0

Utilizzare $ nin con un singolo elemento nell'array. Si comporterà come ci si aspetta. KI con molte delle persone che usano mongo.

4

So che è una vecchia domanda e potrebbe non essere più pertinente, ma poiché non c'era una risposta accettata, ho pensato di commentare per chiunque fosse alla ricerca di una risposta.

Sono stato in grado di riprodurre il problema su MongoDB versione 2.4.9.

> db.sourceListings.findOne({displayed:{$ne:null}}); 
{ 
    <.. other stuff went here..> 
    "displayed" : null 
} 

Il problema scompare Versione 2.6.1:

> db.sourceListings.findOne(); 
{ 
    <.. other stuff ..> 
    "displayed" : null 
} 
> db.sourceListings.findOne({displayed:{$ne:null}}); 
null 

Probabilmente è stato fissato da qualche parte tra queste due versioni.

+0

Grazie. È piuttosto sciatto di 10gen. Penseresti che avrebbero avuto unit test per coprire questi principi fondamentali. – UpTheCreek