2014-12-16 3 views
1

p1 또는 p2을 어떻게 신경 쓸 수 있습니까?mongodb에서 키를 무시하는 방법?

플레이어가 player1인지 player2인지는별로 신경 쓰지 않습니다. 내가 관심을 갖는 것은 그들이 경기에서 서로 대결하는 것입니다. 나는이 형식의 문서를

, 그것은 토너먼트에서 경기 한 경기 나타냅니다 : 나는 'ben'name와 플레이어를 포함하는 모든 게임을 찾으려면

{u'_id': ObjectId('5490690b2e8738094b2f8753'), 
u'date': u'2014-08-02', 
u'game': 7, 
u'players': {u'p1': {u'char': u'marth', 
         u'name': u'jack', 
         u'stocks': {u'stock1': {u'dmg': 133, u'time': 89}, 
            u'stock2': {u'dmg': False, 
               u'time': False}, 
            u'stock3': {u'dmg': False, 
               u'time': False}, 
            u'stock4': {u'dmg': False, 
               u'time': False}}}, 
       u'p2': {u'char': u'fox', 
         u'name': u'ben', 
         u'stocks': {u'stock1': {u'dmg': 45, u'time': 15}, 
            u'stock2': {u'dmg': 77, u'time': 35}, 
            u'stock3': {u'dmg': 102, u'time': 78}, 
            u'stock4': {u'dmg': 80, u'time': 120}}}}, 
u'stage': u'bf', 
u'tournament': u'King of Kings 2014'} 

을; 그가 p1 또는 p2이면 관련이 없습니다. 난 단지 내가이 작업을 수행 할 수 있다는 사실을 알고 :

db.games.aggregate([{'$project' : {'players.p1.name': 1}}, 
    {'$group': {'_id' : '$players.p1.name', 'count': {'$sum': 1}}}]) 

출력 :

{u'ok': 1.0, 
u'result': [{u'_id': u'ben', u'count': 4}, 
      {u'_id': u'man', u'count': 21}, 
      {u'_id': u'hammy', u'count': 5}, 
      {u'_id': u'left', u'count': 9}, 
      {u'_id': u'armed', u'count': 12}, 
      {u'_id': u'icicle', u'count': 11}, 
      {u'_id': u'2king', u'count': 45}, 
      {u'_id': u'strangelove', u'count': 9}, 
      {u'_id': u'jack', u'count': 16}]} 

을하지만 그것은 단지 나에게 p1을 제공합니다. 앞서 말했듯이, 나는 그들이 실제로 어떤 선수인지는 신경 쓰지 않습니다.

이러한 종류의 조회를 효율적으로 수행 할 수 있도록 내 데이터 구조 (스키마?)를 변경해야한다고 조언 해 주실 수 있습니까?

플레이어를 players 배열에 넣으려고했는데 (p1/p2 키가 없지만 다른 쿼리를 어렵게 만드는 것처럼 보였습니다).

그래서 나는

+0

해결 했습니까? – datasci

답변

0

가장 쉬운 것은 배열에 선수를 추가입니다 ...이 경우 최선의 전략이 무엇인지 모르겠습니다.

{ 
    "_id" : ... 
    ... 
    "ps" : ["jack", "ben"] 
    ... 
} 

모두에서 재생이 잭과 일치 찾으려면, 그것은 나에게 보인다

db.games.find({ "ps" : "jack" }) 

당신이 당신에게 각 플레이어의 길이가 2 배열의 객체 인 경우보다 자연스러운 구조를 가지고 있고, 것 ' 주어진 플레이어와 관련된 모든 일치를 찾기 위해 위와 유사한 쿼리를 수행 할 수 있지만 다른 쿼리는 더 어려워집니다. 당신은 그 쿼리가 무엇인지 말하지 않았으므로 나는 그들을 도와 줄 수는 없지만 단지 이름을 가진 여분의 배열을 추가하는 것은 관계없이 도움이 될 것입니다.

0

문서의 구조를 변경하고 싶지 않다면, Python의 MongoDB API를 사용하면 어떨까요?

import pymongo 

db = pymongo.MongoClient() 
document = db.my.collection.find({},{"_id":0}) 

names = [] 

for document in documents: 
    for players in document['players']: 
     names.append(document['players'][players]['name']) 

for name in set(names): 
    print "{0}:{1}".format(name, names.count(name)) 

"인쇄"대신 결과를 목록이나 사전에 지정할 수 있습니다.

관련 문제