2017-10-16 9 views
0

J'ai quelques documents stockés dans MongoDB, où l'un des champs a le format suivant:Comment créer dynamiquement une requête PyMongo basée sur la notation par points?

document Champ

{field1:{inner_field1:inner_value1, inner_field2:inner_value2, inner_field3:inner_value3}} 

Je sais que pour interroger les documents basés sur inner_value1, je dois utiliser la notation par points dans la requête Mongo comme ci-dessous:

{field1.innerfield1:inner_value1} 

dans mon cas, les champs sur lesquels je dois rechercher les documents de MongoDB seront fournis par une partie externe et ils peuvent être imbriqués ou non. Dans ce scénario, comment puis-je créer dynamiquement une requête basée sur la "notation par points" si j'ai le champ d'origine mentionné dans "Champ de document" ci-dessus? La valeur de champ d'origine peut être imbriquée ou non.

Répondre

0

Après quelques essais, je me suis dit de trouver une solution. Affichage ici car il peut servir de référence aux autres:

input = {'field1':{'sub_field1':'sub_value1', 'sub_field2':'sub_value2', 'sub_field3':'sub_value3'}, 'field2':'value2'} 

new_dict = {} 

for k in input: 
    if (isinstance(input[k], dict)): 
     for l in input[k]: 
      new_key = k+"."+l 
      new_dict[new_key] = input[k][l] 
    else: 
     new_dict[k] = input[k] 
1

Peut-être quelque chose comme ceci:

field1 = "a" 
innerfield = "b" 
innvervalue = "c" 

collection = MongoClient().db.collection 
key = "%s.%s" % (field1, innerfield) 
for doc in collection.find({key: innvervalue}): 
    print(doc) 
+1

'changement collection.find ({key, innvervalue})' 'à collection.find ({key: innvervalue})', virgule est mal. – ALH

+0

Merci pour votre réponse. Mais, je cherchais une réponse sur la façon de le faire dynamiquement lorsque je ne connais pas les clés et je ne sais pas si l'entrée contient des valeurs imbriquées ou non. – Jay