2012-11-28 61 views
0

我使用PyMongoMongoDB獲取數據。集合中的所有文件看起來像下面的結構:使用現有值的MongoDB選擇

{ 
    "_id" : ObjectId("50755d055a953d6e7b1699b6"), 
    "actor": 
    { 
     "languages": ["nl"] 
    }, 
    "language": 
    { 
     "value": "nl" 
    } 
} 

我想其屬性language.value是財產actor.languages內獲取所有的談話。

目前,我知道如何尋找所有的交談恆定值內actor.languages(例如,所有的交談ENactor.languages)。

但我被困在如何做與當前文檔中的變量值(language.value)相同的比較。

任何幫助,歡迎提前致謝!

回答

1
db.testcoll.find({$where:"this.actor.languages.indexOf(this.language.value) >= 0"}) 
+1

我不得不添加''actor.languages':{'$ exists':True}'和''language':{'$ exists':True}'因爲並非所有文檔都具有相同的結構。謝謝! – Voles

1

你可以使用一個$where提供查詢集是小,但任何實際大小,你可以開始看到的問題,特別是因爲該查詢似乎是一個需要被實時頁面和JS運行引擎是單線程的其他問題。

我實際上會考慮在這種情況下更好的方法是通過客戶端,它是非常直接的,根據其中一個值提取記錄,迭代並測試它們的條件double值(即根據language.value是前一個值的nl和測試值actor.languages)。

我想你可能可以用聚合框架做到這一點,但是,在最低你不能使用$match內的計算字段。我會想象它會是這樣的:

{$project: 
    {languages_value: "$language.value", languages: "$actor.languages"} 
}, {$match: {"$languages": {$in:"$languages_values"}} 

如果可以的話。但可能有辦法。

+0

目前我們在我們的數據庫中有大約1200000個文檔,我認爲'現在'將會完成這項工作。不知道「聚合框架」,現在就查看它。謝謝你的幫助! – Voles

+1

@Vole一個'$ where'永遠不會在很長的時間內完成1.2M文檔,它將查詢速度降低了10倍,並且人們在使用它時每秒看到大約67k個文檔,並且由於它不使用索引,它將會掃描所有1.2m或所有這些字段存在的地方,現在您已添加$ exists子句。但是,如果你發現它確實有用,那就堅持下去:) – Sammaye

+0

它現在可以工作,但是使用'$ where'不太好。如果系統變慢,我會考慮您的建議並加以實施。再次感謝! – Voles