2013-10-07 33 views
0

我想創建一個使用pymongos查找函數但使用用戶參數的函數。如何在find()中使用多個可選參數pymong

class ServiceLog(Document): 
    # session_id = sessionStart.pk 
    creation_date = DateTimeField(required=True) 
    log_level = StringField(required=True) 
    tag = StringField(required=True) 
    message = StringField(required=True) 
    db.service_log.ensure_index(u'log_level', 1) 
    db.service_log.ensure_index(u'tag', 1) 


    def log(self, logLevel, taG, messagE, sid): 
     logging.basicConfig(level=logging.DEBUG) 
     time = asctime() 
     ServiceLog(creation_date=time, 
        log_level=logLevel, 
        tag=taG, 
        message=messagE, 
        session_id=sid).save() 

    def listLog(self, logLevel, taG, messagE, sid, lim_num, sk_num): 
     db.log.find(creation_date=time, 
        log_level=logLevel, 
        tag=taG, 
        message=messagE, 
        session_id=sid).skip(sk_num).limit(lim_num) 

如何更改listLog,以便用戶可以輸入任何數量的參數匹配?

+0

請問,什麼是'文檔'? – alexvassel

回答

0

你可以使用**kwargs,稍作調整。

例如:

def listLog(self, sk_num=0, lim_num=0, **kwargs): 
    db.log.find(kwargs).skip(sk_num).limit(lim_num) 

此代碼執行以下操作:

  1. 定義的方法與具有缺省值兩個可選參數:sk_num和lim_num。

  2. **kwargs是「根據需要添加更多額外的關鍵字參數,並將它們放入名爲kwargs的字典中」的簡寫形式。 Read up on this

  3. 它使用kwargs字典作爲mongodb的find()中的搜索查詢。這意味着傳遞給函數的參數值必須是安全且有效的mongo查詢選項。

您將不得不更改參數的名稱以匹配MongoDB文檔條目的名稱。因此,不是將您的方法命名爲參數logLevel,而是將其命名爲log_level以匹配集合。