2013-08-31 5 views
0

Laissez-moi être directement à la question, OK, j'ai la structure du document commeInterrogation Documents intégrés MongoDB

laisser le nom de la collection soit échantillon;

si je ne connaissais pas le someIdAsString.

{ 
_id : ObjectId("someObjectId"), 
test : { 
    someIdAsString : { 
     field1 : value1, 
     field2 : value2 
    }, 
      someOtherIdAsString : {} 
      ..... 
      ..... 
      And so on 
    } 
} 

J'ai les field1 & valeurs field2 Comment faire une requête de la collection en utilisant ces informations.

field1 & field2 sera connu au moment de l'exécution permet de dire qu'il est field1 = '33' & field2 = '3333' et le document comme

{ 
_id : ObjectId("522182515f8wea670900001b"), 
test : { 
    522182515f8c4wd70900001b : { 
    field1 : '33', 
    field2 : '3333' 
    }, 
     522182515f8cea670900001b : {} 
     ..... 
     ..... 
     And so on 
    } 
} 

Merci

+1

Veuillez donner un exemple avec les données de collecte réelles et un résultat attendu. –

+0

Une partie du programme qui fait réellement la requête, rendrait les choses plus claires. – thefourtheye

+0

field1 & field2 seront connus lors de l'exécution permet de dire qu'il est field1 = '33' & field2 = '3333' et le document comme '{ _id: ObjectId ("5221828c5f8cea670900as1d"), test: { 5221828c5f8cea670900001d : { field1: '33', field2: '3333' }, 5221828c5dscea670900001d: {} ..... ..... Et ainsi de suite }} , ' – Beast

Répondre

1

Je vous suggère de modifier le schéma , de sorte que ce texte someIdAsString devienne une valeur au lieu d'une clé, ce qui rend l'objet dans test devenir une liste d'objets. Si vous connaissez chaque touche, vous pouvez essayer

db.sample.find({$or: [ 
    {"test.someIdAsString.field1": value1, 
    "test.someIdAsString.field2": value2}, 
    {"test.someOtherIdAsString.field1": value1, 
    "test.someOtherIdAsString.field2": value2}, 
    ... 
]}) 

Pour toutes vos possibilités "someIdAsString".

Si vous modifiez la structure:

{ 
    _id : ObjectId("someObjectId"), 
    test : [ 
     { 
      _id : someIdAsString, 
      field1 : value1, 
      field2 : value2 
     }, 
     { 
      _id : someOtherIdAsString, 
      field1 : value3, 
      field2 : value4 
     }, 
     ... 
    ] 
} 

Vous pouvez modifier la requête:

db.sample.find({ 
    "test.field1": value1, 
    "test.field2": value2 
}) 

Une solution de contournement à utiliser une requête tout en utilisant votre structure de données sans connaître les noms clés intégrés serait un JavaScript dans un $where operator.

db.sample.find(function(){ 
    var ttk; 
    var tt = this.test; 
    for(key in tt){ 
     ttk = tt[key] 
     if(ttk.field1 === value1 && ttk.field2 === value2){ 
      return true; 
     } 
    } 
    return false; 
}) 
+0

Merci @HD pour votre temps, Je voulais savoir s'il y avait un moyen d'interroger en utilisant mongoskin lui-même, mais je pense que j'ai trouvé la réponse et c'est non je suppose. – Beast

+0

La fonction de mon dernier exemple peut être utilisée comme un '{$ match: function() {...}}', ou un '{$ match:" (function (tt) {...}) (this. test) "}' requête, que vous pouvez probablement utiliser dans un 'collection.find' de mongoskin. –

Questions connexes