2012-04-03 12 views
5

erwartet, wenn ich die folgende Abfrage:

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

Ich erwarte, dass alle Benutzer erhalten, deren pic.status nicht null ist. Allerdings sieht das tatsächliche Ergebnis etwas wie folgt aus:

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

Das heißt, ich erhalten Benutzer, deren pic.status ist null. Wie kann ich das beheben?

Antwort

2

Ich kann nicht scheinen, dies zu reproduzieren. Welche Version von Mongo verwendest du? (Ich benutze 2.1.1-pre) Hier sind die Schritte, die ich gemacht habe. Hier finden Sie von der JS-Shell:

> 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" 
     } 
    } 
] 

Nur das Dokument mit "pic.status": "Something" zurückgeführt wird.

Mein einziger Gedanke ist, sind Sie absolut sicher, dass der Wert von (null) in der Abfrage derselbe ist, was in den Dokumenten gespeichert ist? Wurden die Dokumente mit der JS-Shell gespeichert oder wurden sie mit einem Treiber in einer anderen Sprache gespeichert? Theoretisch sollte null, sollte null sein, in jeder Sprache, aber ich weiß, dass verschiedene Sprachen "keinen Wert" anders darstellen. In Python zum Beispiel ist der Wert für "kein Wert" (None). (null) wird in Python nicht erkannt.

In einem Python-Shell, habe ich versucht, ein Dokument mit (null) als ein Wert zu speichern, sondern einen Fehler empfangen:

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 

I dann (mit dem Python Shell) eingefügt, um einen Status von 'null' ('null' ist ein String)

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

Es überrascht nicht, wenn ich die Abfrage in der JS Shell reran, dieses Dokument zurückgegeben wurde, weil 'null'! = 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 
     } 
    } 
] 

Ist das ähnlich wie bei Ihnen, oder können Sie diese 100% in der JS-Shell reproduzieren? Hoffentlich werden wir in der Lage sein, dieses Problem zu lösen!

+0

Ich wollte nur sagen, dass ich das in meiner eigenen Installation "reproduzieren" konnte. Ich habe mapReduce verwendet, um eine Sammlung zu generieren. Wenn ich renne: 'db.analysis.find ({'value.ds': {$ exists: true}, 'value.ds ': {$ ne: null}}) 'Ich werde mit begrüßt' {"_id": "", "Wert": {"ds": null, "ro": null}} {"_id ": "00003262a3a6c8b50b470f4021812aef13e079a89756dcafbc5efa1168632548", "Wert": { "ds": null, "ro": null}} { "_id": "0000ddd5f3845f44631651719c846c42dffe7001816c53a7aa8814b1d61c1017", "Wert": { "ds": null, "ro": null }} ' – awshepard

+0

Das Problem ging weg, nachdem ich Mongo neu installiert habe. Nicht sicher, was es verursacht haben könnte. Ich bin sicher, es war ein richtiger Nullwert, aber danke für die Antwort Marc. Dein erstes Beispiel funktioniert jetzt einwandfrei für mich. –

0

Verwenden Sie $ nin mit einem einzelnen Element im Array. Es wird sich so verhalten, wie Sie es erwarten. KI mit vielen Leuten, die Mongo benutzen.

4

Ich weiß, es ist eine alte Frage, und vielleicht nicht mehr relevant, aber da es keine akzeptierte Antwort gab, dachte ich, ich werde kommentieren für jeden, der eine Antwort sucht.

Ich konnte das Problem auf MongoDB Version 2.4.9 reproduzieren.

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

Das Problem verschwindet auf Version 2.6.1:

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

Wahrscheinlich irgendwo zwischen diesen beiden Versionen behoben wurde.

+0

Danke. Das ist ziemlich schlampig von 10gen. Sie würden denken, dass sie Einheitstests haben, um diese Grundlagen zu decken. – UpTheCreek

Verwandte Themen