2012-02-16 32 views
17

Mi colección (MongoDB v 2.0.2) presenta los siguientes registros:consultas MongoDB con valor nulo

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

organization tiene índices:

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

(tenga en cuenta que ponen awarnes sparse : false - conceder que nula está indexado) Pero, ejecutando:

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

devoluciones conjunto vacio. ¿Qué está mal? Gracias de antemano

+0

¿Todavía tiene problemas con esto? ¿Puede dar el resultado de db.system.indexes.find() así como de db.organization.find(). Explain()? – Barrie

+0

@Barrie, ahora no puedo reproducir este error. Estoy bastante seguro de que fue alcanzado por la aplicación múltiple de scripts 'js' desde la herramienta de línea de comandos. Esas veces he comenzado a 'explicar' para reconocer el error, pero muestra un uso normal de los índices – Dewfy

Respuesta

6

sólo nos registramos en el siguiente script 2.0 y 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}) 

vuelve realidad un documento que se espera:

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

También se puede mirar en este documento sobre querying and nulls , probablemente debería ayudarlo a evitar posibles errores futuros.

+0

, es algo mágico. Tu ejemplo con 'items' funciona, pero el mío apesta. – Dewfy

18

Tuve el mismo problema. Después de leer los siguientes documentos

Traté de consulta para los diferentes tipos de elementos BSON y encontré que mi nula fue representado como un tipo de elemento BSON 6 (no definido, no se use) en lugar del elemento BSON esperado tipo 10 (nulo).

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

basado en el primer enlace, creo que debería ser 'db.collection.find ({field: {" $ type ": 10}};' – AbdelHady

+1

@AbdelHady: Tal vez los documentos representan una versión simplificada de la realidad. Acabo de tener para usar '{field: {$ type: 6}}' en una 'actualización' donde realmente quiero decir' {field: null} '. –

+2

@AbdelHady: Scratch that, creo' {$ type: 10} ' realmente es lo correcto y solo me estoy confundiendo. –

Cuestiones relacionadas