2011-05-30 24 views
28

¿Es posible poner la clave en una consulta? Por ejemplo, dado el siguiente registro, me gustaría hacer un .find({'a.*': 4}) Esto fue discutido aquí https://jira.mongodb.org/browse/SERVER-267 pero parece que no se ha resuelto.Comodín de MongoDB en la clave de una consulta

{ 
    'a': { 
    'b': [1, 2], 
    'c': [3, 4] 
    } 
} 
+0

tengo el mismo problema con mongo. Tengo muchos documentos como este: {one: {two: {more: data}, también: {more: data}}} una vez que está a un nivel de profundidad en el árbol de documentos, cada nodo en el segundo nivel es un contenedor para documentos con estructura consistente. entonces me gustaría poder buscar de esta manera: find ({'one. *. some.data': 5}) – rev

Respuesta

10

Según lo solicitado, esto no es posible. El problema del servidor al que se ha vinculado sigue estando en "problemas de los que no estamos seguros".

MongoDB tiene algo de inteligencia sobre el uso de matrices, y creo que eso es parte de la complejidad que rodea dicha característica.

Realice la siguiente consulta db.foo.find({ 'a.b' : 4 }). Esta consulta coincidirá con los siguientes documentos.

{ a: { b: 4 } } 
{ a: [ { b: 4 } ] } 

¿Qué hace "comodín" hacer aquí? db.foo.find({ a.* : 4 }) ¿Coincide con el primer documento? ¿Qué hay del segundo?

Por otra parte, ¿qué significa esto semánticamente? Como ha descrito, la consulta es efectivamente "encontrar documentos donde cualquier campo en ese documento tiene un valor de 4". Eso es un poco inusual

¿Hay una semántica específica que está tratando de lograr? Tal vez un cambio en la estructura del documento le dará la consulta que desea.

+0

gracias, eso aclara. Más específicamente, lo que estoy buscando hacer es comodín solo el nodo específico en la rama, es decir, cualquier subcampo apropiado de a. No tengo claro cómo a. * Dice 'encontrar en cualquier campo'. ¿No es 'encontrar documentos que tienen un campo de nivel superior' a 'con un subcampo que coincida con 4'? – Brad

+0

Creo que la confusión aquí está alrededor del "subcampo". Cuando escribo '{a: {b: 4, c: 2}}', estoy diciendo que el valor 'a' es un objeto JSON. Ese objeto JSON tiene dos teclas 'b' y' c'. El valor de esas teclas es 4 y 2 respectivamente. Cuando está pidiendo 'a. *', Efectivamente está pidiendo la sintaxis que recorre todas las claves en ese objeto JSON. No estás pidiendo * "recorrer una matriz" *, estás pidiendo * "recorrer las propiedades de un objeto" *. Eso es un poco inusual, por eso estoy pidiendo un caso de uso específico aquí. –

+2

@gates: Tengo un caso de uso. myDocInMongo = {'someUnknownKey': {propToCheck: true}, 'someKnownKey': true}; Ahora, quiero encontrar este documento usando el selector {someKnownKey: {$ exists: true}} pero también quiero asegurarme de que ninguna de las otras claves tenga un objeto con la propiedad propToCheck. Por lo tanto, como el siguiente: {'* .propToCheck': {$ exists: false}, {someKnownKey: {$ exists: true}}} – doubletap

Cuestiones relacionadas