2012-04-03 15 views
5

Cuando emito la siguiente consulta:

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

espero recibir todos los usuarios cuyo pic.status no es nulo. Sin embargo, el resultado real es como la siguiente:

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

Es decir, que reciben los usuarios cuyas pic.status es nulo. ¿Cómo puedo arreglar esto?

Respuesta

2

Parece que no puedo reproducir esto. ¿Qué versión de Mongo estás usando? (Estoy usando 2.1.1-pre) Aquí están los pasos que tomé. La siguiente es de la cáscara 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" 
     } 
    } 
] 

Sólo el documento que contiene "pic.status": se devuelve "algo".

Mi único pensamiento es, ¿estás absolutamente seguro de que el valor de (nulo) en la consulta es el mismo que el guardado en los documentos? ¿Se guardaron los documentos usando el shell JS, o se guardaron usando un controlador en un idioma diferente? Teóricamente, nulo, debe ser nulo, debe ser nulo, en cualquier idioma, pero sé que los diferentes idiomas representan "ningún valor" de manera diferente. En python, por ejemplo, el valor para "sin valor" es (Ninguno). (nulo) no se reconoce en python.

En una cáscara de pitón, I trataron de guardar un documento con (null) como un valor, pero ha recibido un error:

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 

entonces Inserté (con la cáscara Python) un estado de 'nulo' ('nulo' siendo una cadena)

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

No es de extrañar, cuando volvió a ejecutar la consulta en la cáscara JS, fue devuelto este documento, porque 'nulo'! = 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 
     } 
    } 
] 

¿Es esto similar a lo que está experimentando o puede reproducirlo al 100% en el depósito JS? ¡Con suerte, podremos llegar a la raíz de este problema!

+0

Solo quería decir que he podido "reproducir" esto en mi propia instalación. Estaba usando mapReduce para generar una colección. Cuando ejecuto: 'db.analysis.find ({'value.ds': {$ exists: true}, 'value.ds ': {$ ne: null}}) 'Me saludan con ' {"_id": "", "value": {"ds": null, "ro": null}} {"_id ": "00003262a3a6c8b50b470f4021812aef13e079a89756dcafbc5efa1168632548", "valor": { "DS": null, "ro": null}} { "_id": "0000ddd5f3845f44631651719c846c42dffe7001816c53a7aa8814b1d61c1017", "valor": { "DS": null, "ro": null }} ' – awshepard

+0

El problema desapareció después de volver a instalar Mongo. No estoy seguro de qué pudo haberlo causado. Estoy seguro de que era un valor nulo, pero gracias por la respuesta Marc. Tu primer ejemplo funciona sin problemas para mí ahora. –

0

Use $ nin con un solo elemento en la matriz. Se comportará como lo esperabas. KI con muchas de las personas que usan mongo.

4

Sé que es una pregunta antigua, y puede que ya no sea relevante, pero como no hubo una respuesta aceptada, pensé que haría un comentario para cualquiera que esté buscando una respuesta.

Pude reproducir el problema en MongoDB versión 2.4.9.

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

El problema desaparece en la versión 2.6.1:

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

Probablemente se fijó en algún lugar entre estas dos versiones.

+0

Gracias. Eso es bastante descuidado de 10gen. Pensarías que tendrían pruebas unitarias para cubrir estos conceptos básicos. – UpTheCreek

Cuestiones relacionadas