2011-05-30 3 views
28

Est-il possible de joker la clé dans une requête? Par exemple, étant donné l'enregistrement suivant, je voudrais faire un .find({'a.*': 4}) Cela a été discuté ici https://jira.mongodb.org/browse/SERVER-267 mais il semble que ce n'est pas résolu.Caractère générique MongoDB dans la clé d'une requête

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

J'ai le même problème avec mongo. J'ai beaucoup de documents comme ceci: {one: {two: {more: data}, aussi: {more: data}}} une fois que vous avez un niveau profond dans l'arbre du document, chaque noeud au second niveau est un conteneur pour les documents avec une structure cohérente. donc je voudrais pouvoir chercher comme ceci: find ({'one. *. some.data': 5}) – rev

Répondre

10

Comme demandé, ce n'est pas possible. Le problème de serveur auquel vous êtes lié est toujours sous "problèmes dont nous ne sommes pas sûr". MongoDB a une certaine intelligence entourant l'utilisation de tableaux, et je pense que cela fait partie de la complexité entourant une telle fonctionnalité.

Répondez à la requête suivante db.foo.find({ 'a.b' : 4 }). Cette requête correspondra aux documents suivants.

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

Alors qu'est-ce que "wildcard" fait ici? db.foo.find({ a.* : 4 }) Correspond-il au premier document? Qu'en est-il de la seconde?

De plus, qu'est-ce que cela signifie sémantiquement? Comme vous l'avez décrit, la requête est effectivement "trouver des documents où tout champ dans ce document a une valeur de 4". C'est un peu inhabituel.

Y a-t-il une sémantique spécifique que vous essayez d'atteindre? Peut-être qu'un changement dans la structure du document vous donnera la requête que vous voulez.

+0

merci, cela clarifie. Plus précisément, ce que je cherche à faire est un caractère générique juste le nœud spécifique dans la branche, c'est-à-dire tout sous-champ propre de a. Je ne suis pas clair sur comment un. * Dit «trouver où n'importe quel champ». N'est-ce pas 'trouver des documents qui ont un champ de premier niveau' a 'avec un sous-champ correspondant à 4'? – Brad

+0

Je pense que la confusion ici est autour de "sous-champ". Quand j'écris '{a: {b: 4, c: 2}}', je dis que la valeur 'a' est un objet JSON. Cet objet JSON a deux clés 'b' et' c'. La valeur de ces touches est 4 et 2 respectivement. Lorsque vous demandez 'a. *', Vous demandez en fait une syntaxe qui parcourt toutes les clés de cet objet JSON. Vous ne demandez pas à * "parcourir un tableau" *, vous demandez à * "parcourir les propriétés d'un objet" *. C'est un peu inhabituel, c'est pourquoi je demande un cas d'utilisation spécifique ici. –

+2

@gates: J'ai un cas d'utilisation. myDocInMongo = {'someUnknownKey': {propToCheck: vrai}, 'someKnownKey': true}; Maintenant, je veux trouver ce document en utilisant le sélecteur {someKnownKey: {$ exists: true}} mais je veux aussi m'assurer qu'aucune des autres clés n'a un objet avec la propriété propToCheck. Donc, comme suit: {'* .propToCheck': {$ exists: false}, {someKnownKey: {$ existe: vrai}}} – doubletap

Questions connexes