2016-12-31 39 views
0

我插使用Python我蒙戈數據庫中的下列文件:回到嵌套的集合元素作爲對象在Python

@cherrypy.expose 
def create(self): 
    client = MongoClient() 
    db = client.database_name   
    result = db.users.insert_one({ 
     "email": "[email protected]", 
     "company": { 
      "name": "ABC Company" 
     } 
    }) 

現在,我已經從存儲在收集查詢結果,使用變量(COMPANY_NAME) :

@cherrypy.expose 
def result(self): 
    client = MongoClient() 
    db = client.database_name   
    cursor = db.users.find({"email":"[email protected]"}) 
    for document in cursor: 
     email = document["email"] 
     company_name = document["company"]["name"] 
    return company_name 

我想嵌套的元素返回爲目標,如:company.name而不是作爲變量(COMPANY_NAME)

如何修改我的結果函數的n將收集結果存儲爲對象屬性?

1 - 我使用CherryPy作爲HTTP服務器。我沒有使用任何ORM,也沒有使用Template引擎。

+1

您需要創建一個描述該對象的Python類,並返回該類的一個實例。 – DyZ

+0

請澄清一下:你是否想從HTTP返回整個'{ 「email」:「[email protected]」, 「company」:{ 「name」:「ABC Company」 } } JSON格式的處理程序? – webKnjaZ

+0

是的,我想返回整個對象。 – Rimo

回答

0

使用namedtuplecollections模塊:

from collections import namedtuple 
company = namedtuple('company ', 'name') 
document = namedtuple('document ', 'email, company') 

,然後在循環中:

for row in cursor: 
    result = document(row["email"], company(row["company"]["name"])) 
    yield result # or 'return result' if there is only one of them 

namedtuple將您訪問的參數(但只讀因爲它是一個元組),均爲位置(由index [0],[1]等)和屬性(result.email)。所有屬性也是隻讀屬性,因此它們附帶預焙fget函數,可用於mapfilter

+0

我可以將這些參數作爲參數傳遞給使用這些新符號的其他函數嗎?例如 - def new(result.name) – Rimo

+0

或者更好,我應該如何將這些傳遞給文件?以下示例:return template.format(result = result)? – Rimo

+0

@Gerr,你用'namedtuple'獲得的構建函數創建的任何實例實際上都是一個元組和一個類實例。所以你可以使用它。在不相關的說明中,我不會使用'new'作爲自己函數的名稱,因爲在創建常規對象的過程中它已經被Python使用。它可能會在調試時感到困惑,或者更糟糕的是,會擾亂常規對象創建過程。另外需要注意的是,'namedtuple'純粹是用Python(沒有C)實現的,所以你可以看看它在'collections'模塊中的作用。 –

相關問題