2013-08-22 2 views
1

문서 프로토 타입으로는 SQL 변환 : pymongo를 사용하여 MongoDB에서는 pymongo 쿼리

SELECT a, b, c, d from Table WHERE d='D' AND e='E' GROUP BY a 

:

{ 
    "d": "D", 
    "g": { 
     "c": "C", 
     "a": "A", 
     "b": "B" 
    }, 
    "e": "E", 
    "f": "F" 
} 

은 무엇에 해당하는 것입니까? 다음은하지 않습니다,

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"}}]) 

그것은 빈리스트, 심지어 쿼리 (커서) 객체를 반환한다.

또한 출력을 a, b, cd 필드로만 제한 할 수 있도록 어떻게 $ project를 포함시킬 수 있습니까?

참고 e = 'E'를 필터링하도록 컬렉션을 만들었습니다.

+0

그러나, 이번에는 어떤 나타납니다 하나는 대답했다 – Sammaye

+0

그런 식으로 생각하면 죄송합니다. 그러나 노력이 들어갔다. 사람은 판단하는 것에 너무 빠르지 않아야합니다. 최소한 그들은 스스로 솔루션에 접근하는 것을 귀찮아 할 수 없을 때. 너무 무례한 경우에 다시 미안. @Sammaye –

+0

만약 당신이 노력을 보여 주면 나는 또한 "귀찮게"될 것이고 편집도 완벽하게 잘될 것입니다 :'> db.z.insert ({d : 'D', g : {c : 'C', a : 'D', 'E': 'E', 'E', 'E': 'A', b : 'B'{ "결과": [{ "_id": "A"}], "ok": 1}'또한 유효하지 않습니다. {{id : '$ g.a'}} pymongo 구문 – Sammaye

답변

1

실제로 쿼리가 유효한 SQL이 아닙니다.

당신은 문자열

SELECT a, b, c, d 
from Table 
WHERE d='D' AND e='E' 
GROUP BY a 

그리고 아직도이 쿼리의 MySQL에서만 작동을 인용해야합니다. AnsiSQL를 들어 당신이의 배열을 원하는 경우 다음 MongoDB의 쿼리

db.<your collection>.aggregate([ 
    {$match:{"d":"D", "e":"E"}}, 
    {$group:{_id:"$g.a", b: { $min: "$g.b"}, c: {$max:"$g.c"}}} 
]) 

같은 것

SELECT a, min(b) as b, max(c) as c 
from Table 
WHERE d='D' AND e='E' 
GROUP BY 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"}} 
     } 
    } 
]) 

그냥이 코드를 테스트 - 그것은 작동, 여기 파이썬 코드입니다 :

>>> 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'}]}] 
+0

감사.또한, SQL에서 정정하십시오. 그러나 따옴표는 분명히 의도 된 것으로 남겨졌습니다. 하지만 그렇게해서는 안된다. 여기에 AnsiSQL 쿼리에 대한 요구 사항이 없습니다. 나는 a, b, c, d를 갖는 객체를 a와 d로 그룹화하고 e는 E이어야합니다. min 및 max 함수없이 쿼리를 렌더링 할 수 있습니까? –

+0

Mongo에 대한 액세스 권한이 없지만 업데이트 된 답변보기 –

0

당신이 @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 } 

문제는 당신이 구문을 변경하지 않고 파이썬에서이 작업을 수행하려고하는 것이 대부분이다. 대신 당신이 파이썬에서 이것을 실행됩니다 : 참고로

db.z.aggregate([{"$match":{"d":"D","e":"E"}},{"$group":{"_id":"$g.a"}}]) 

: 우리는 문제를 해결하기 위해 당신의 부분에 노력을 증명하지 이러한 유형의 질문에 대답하지 않는 일반적으로 http://api.mongodb.org/python/current/examples/aggregation.html