簡體   English   中英

如何忽略mongodb中的鍵?

[英]How to ignore a key in mongodb?

我如何不關心p1p2

我永遠不會在乎玩家是玩家1還是玩家2。 我只關心他們在一場比賽中互相對抗。

我有這種格式的文件,它代表錦標賽中一場比賽的一場比賽:

{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'}

我想找到所有涉及玩家的游戲,游戲nameben ”。 他是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鍵,但這似乎使其他查詢更難了)。

所以我不確定在這種情況下最好的策略是什么...

最簡單的方法是將播放器添加到數組中。

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

要查找傑克參加過的所有比賽,

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

在我看來,如果每個玩家都是長度2數組中的一個對象,您的結構就會更加自然,並且您可以執行與上述類似的查詢來查找涉及給定玩家的所有比賽,但是您說這使得其他查詢更加困難。 您沒有說這些查詢是什么,所以我無法為您提供幫助,但是無論如何,添加僅包含名稱的額外數組都應該有所幫助。

如果您不想更改文檔的結構,那么如何使用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))

您可以將結果分配給列表或字典,而不是“打印”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM