[英]Convert an SQL into pymongo query
文件原型:
{
"d": "D",
"g": {
"c": "C",
"a": "A",
"b": "B"
},
"e": "E",
"f": "F"
}
相當於什么:
SELECT a, b, c, d from Table WHERE d='D' AND e='E' GROUP BY a
在mongodb中使用pymongo?
以下查詢返回對象:
db.<collection>.find({'d': 'D'}, {'g.c': 1, 'g.a': 1, 'g.b': 1, 'd': 1, '_id': 0})
但是,以下不是:
db.<collection>.aggregate([{$match:{"d":"D", "e":"E"}},
{$group:{_id:"$g.a"}}])
它返回一個空列表,甚至沒有查詢(游標)對象。
另外,如何將$ project包含在其中,以便將輸出限制在a,b和cd的字段中?
注意我已經創建了集合,以便過濾e ='E'。
實際上,您的查詢不是有效的SQL。
您必須引用字符串
SELECT a, b, c, d
from Table
WHERE d='D' AND e='E'
GROUP BY a
而且此查詢僅在MySQL中有效。 對於ANSI SQL(以及大多數實現),您應為列指定匯總,例如
SELECT a, min(b) as b, max(c) as c
from Table
WHERE d='D' AND e='E'
GROUP BY a
那么您的mongodb查詢將是
db.<your collection>.aggregate([
{$match:{"d":"D", "e":"E"}},
{$group:{_id:"$g.a", b: { $min: "$g.b"}, c: {$max:"$g.c"}}}
])
如果您想要一個由a,b,c,d值組成的數組,則應該可以使用:
db.<your collection>.aggregate([
{$match:{"d": "D", "e": "E"}},
{
$group: {
_id: "$g.a",
data: {$push: {"a": "$g.a", "b": "$g.b", "c": "$g.c", "d": "$d"}}
}
}
])
剛剛測試過此代碼-它起作用,這是python代碼:
>>> cl = MongoClient()
>>> coll = cl["local"]["test3"]
>>> res = coll.aggregate([{"$match":{"d": "D", "e": "E"}},{"$group":{"_id":"$g.a", "data": {"$push":{"a":"$g.a", "b":"$g.b", "c":"$g.c", "d":"$d"}}}}])
>>> res["result"]
[{'_id': 'A', 'data': [{'a': 'A', 'c': 'C', 'b': 'B', 'd': 'D'}, {'a': 'A', 'c': 'K', 'b': u'V', 'd': 'D'}]}]
如您所見,@ RomanPekar的答案確實有效:
> db.z.insert({d:'D',g:{c:'C',a:'A',b:'B'},e:'E',f:'F'})
> db.z.aggregate([{$match:{d:'D',e:'E'}},{$group:{_id:'$g.a'}}])
{ "result" : [ { "_id" : "A" } ], "ok" : 1 }
問題很可能是您嘗試在python中執行此操作而不更改語法。 相反,您可以在python中運行它:
db.z.aggregate([{"$match":{"d":"D","e":"E"}},{"$group":{"_id":"$g.a"}}])
供參考: http : //api.mongodb.org/python/current/examples/aggregation.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.