2012-10-24 135 views
3

這裏有一些關於此的帖子,但並不完全是我所追求的。PyMongo - 查詢嵌入式文檔列表

我有一個包含嵌入的文件列表的文件:

{ 
    "_id": 1234 
    "name": "joe" 
    "comments": [ 
     {"type": "text", "content": "my content"}, 
     {"type": "image", "content": "my_content"} 
     {"type": "image", "content": "my_content"} 
    ] 

} 

我想運行一個查詢得到一組文檔,然後我希望能運行輔助查詢搜索的「意見」來自該初始查詢集的列表。

e.g p = db.people.find({"some":"condition"})然後搜索嵌入文檔一樣p.find({"type":"image"}

這顯然是行不通的。只是想知道是否有辦法做到這一點,而無需再次對父文檔集合運行2個單獨的查詢?

回答

3

如果你只想找到一個集合,滿足給定條件和滿足{"type": "image"}comments數組中,你可以做,在一個查詢中的項目:

p = db.people.find({"some": "condition", "comments.type": "image"}) 

dot notation頁面瞭解更多信息。

如果你確實需要整個事情,而且你對結果中的特定子項感興趣,那麼我能想到的最好的方法就是將結果塞進一個列表中,然後檢查它在Python中。 PyMongo的大師有什麼話要說嗎?請注意,如果你的數據集很大,那麼這是而不是的一個好主意。只使用find用點號

p = list(db.people.find({"some": "condition"}) 

# A little verbose, but... 
image_p = [item for item in p 
      if any(comment['type'] == 'image' 
        for comment in item['comments'])] 

... 
+0

謝謝。對不起,我應該提到我需要在列表中運行幾個輔助查詢,如「comments.type」:「image」,然後是「comments.type」:「其他」等,因此單個查詢將無法工作。 – GivP

+0

@GivP:我用一個想法做了一個快速編輯,雖然它可能不是最好的。 – voithos

+0

是的,我認爲這可能是最好的方法。這也是我最終做到的。謝謝。 – GivP

1

的問題是,您總能獲得整份文件不僅子文檔。

使用mongodb 2.2可以使用Aggregation

look here

注:$ElementMatch不使用時,與位置元素(something.$.someattribute)迭代中,它只會匹配的第一個文件後退出,所以使用聚合得到的所有子文件匹配:)