2014-12-23 3 views
0

У меня есть запрос в mongo db, попробовал много решений, но до сих пор не нашел его рабочим. Любая помощь будет оценена.Перемещение документа Mongodb

Как найти все ключи под названием «канал» в документе?

db.clients.find ({ "_ идентификатор": 69})

{ 
    "_id" : 69, 
    "configs" : { 
     "GOOGLE" : { 
      "drid" : "1246ABCD", 
      "adproviders" : { 
       "adult" : [ 
        { 
         "type" : "landing", 
         "adprovider" : "abc123", 
         "channel" : "abc456" 
        }, 
        { 
         "type" : "search", 
         "adprovider" : "xyz123", 
         "channel" : "xyz456" 
        } 
       ], 
       "nonadult" : [ 
        { 
         "type" : "landing", 
         "adprovider" : "pqr123", 
         "channel" : "pqr456" 
        }, 
        { 
         "type" : "search", 
         "adprovider" : "lmn123", 
         "channel" : "lmn456" 
        } 
       ] 
      } 
     }, 
     "channel" : "ABC786", 
     "_cls" : "ClientGoogleDoc" 
    } 
} 

Пытаясь найти ключи с именем канала

db.clients.find ({» _id ": 69, "канал": истинно})

В ожидании:

{"channels": ["abc456", "xyz456", "ABC786", "xyz456", "pqr456", "lmn456", ...]} 
+3

Можете ли вы перефразировать свой вопрос? это немного сложно понять. –

ответ

1

Насколько я знаю, вы должны использовать Python рекурсивно пройти словарь самостоятельно для того, чтобы создать список, который вы хотите выше:

channels = [] 

def traverse(my_dict): 
    for key, value in my_dict.items(): 
     if isinstance(value, dict): 
      traverse(value) 
     else: 
      if key == "channel": 
       channels.append(value) 

traverse({"a":{"channel":"abc123"}, "channel":"xyzzz"}) 
print(channels) 

выход:

['abc123', 'xyzzz'] 

Однако, используя вещь под названием projections, вы можете получить вид рядом с тем, что хотите (но на самом деле не так, поскольку вы должны указать все каналы вручную):

db.clients.find({"_id": 69}, {"configs.channel":1}) 

возвращается:

{ "_id" : ObjectId("69"), "configs" : { "channel" : "ABC786" } } 

Если вы хотите получить действительно фантазии, вы могли бы написать generator функцию, чтобы сгенерировать все ключи в данном словаре, независимо от того, насколько глубоко:

my_dict = { "a": { 
       "channel":"abc123", 
       "key2": "jjj", 
       "subdict": {"deep_key": 5, "channel": "nested"} 
      }, 
      "channel":"xyzzz"} 

def getAllKeys(my_dict): 
    for key, value in my_dict.items(): 
     yield key, value 
     if isinstance(value, dict): 
      for key, value in getAllKeys(value): 
       yield key, value 

for key, value in getAllKeys(my_dict): 
    if key == "channel": 
     print value 

выход :

nested 
abc123 
xyzzz