2017-06-18 109 views
0

我一直在爲此奮鬥了幾個小時,並且無法在線找到一個好的解決方案。將mongo shell聚合函數轉換爲pymongo時遇到困難

pipeline = [ 

    {"$project": 
{ 
    "index": {"$cond": { {"$and":[{ "$gt": [{ "$indexOfArray": ["$index.championId", 17]}, 5]}, 
{"$lt": [{ "$indexOfArray": ["$index.championId", 22]}, 6]}]} 
,{"$slice": ["$playerInfo.info", 0, 5]}, {"$slice": ["$playerInfo.info", 5, 5]}}}, 
"team_a_champ": { "$slice": ["$playerInfo.info.championId", 0, 5]}, 
"team_b_champ": { "$slice": ["$playerInfo.info.championId", 5, 5]} 
}}, 
{ "$match": { "$or":[ 
{ "$and":[{ "team_a_champ" : 17 }, {"team_b_champ":22}, {"index.stats.win":True}]}, 
{ "$and":[{ "team_a_champ" : 22 }, {"team_b_champ":17}, {"index.stats.win":True}]}]}}, 
{ 
    "$project": 
     { 
      "new_idx": {"$arrayElemAt": ["$index", {"$indexOfArray": ["$index.championId", 17]}]} 
     } 
}, 
{ 
    "$project": 
     { 
      "stats": ["$new_idx.stats.item0", "$new_idx.stats.item1", "$new_idx.stats.item2", "$new_idx.stats.item3", 
         "$new_idx.stats.item4", "$new_idx.stats.item5"] 
     } 
}, 
{ 
    "$sort": 
     {"stats": -1} 
}, 
{"$unwind": "$stats"}, 
{ 
    "$group": 
     { 
      "_id": "$stats", 
      "count": {"$sum": 1} 
     } 
}, 
{"$match": {"_id": {"$gt": 0}}}, 
{"$sort": {"count":-1, "_id": -1}}, 
{"$limit": 6} 
] 

我已經把字符串各地的重要組成部分,但它只是返回類型錯誤:unhashable類型:「快譯通」,而在mongoShell分貝它的工作原理。

請幫忙!或者至少給我一些關於如何轉換它的舒適文檔。我找不到任何東西!

+0

沒有什麼可轉換的。 Python語法與shell的JavaScript語法基本相同。你需要用'$'來引用它們,但是最好用JavaScript來做,因爲它符合JSON表示法的字符串。所有你會有不匹配的括號'[]'或curlies'{}'和一個好的編輯器與linting會爲你排序。您也可以在'$ match'語句中使用'$和'。所有的MongoDB查詢參數實際上都是AND表達式。 –

+0

非常感謝,它解決了我的問題。 –

+0

這是一個體面的編輯器可以做到的驚人之處,不是。 –

回答

0

我遇到的問題是缺少$ cond標籤中的「if」,「then」和「else」。