文档原型(prototype):
{
"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 、c d 字段?
请注意,我创建了该集合以便过滤 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'}]}]
关于python - 将 SQL 转换为 pymongo 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372662/