【问题标题】:How to ignore a key in mongodb?如何忽略mongodb中的键?
【发布时间】:2014-12-17 03:12:09
【问题描述】:

我怎么能不关心p1p2

我从不在乎玩家是 player1 还是 player2,就其本身而言。 我只关心他们在一场比赛中交手过。

我有这种格式的文件,它代表锦标赛中的一场比赛:

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

我想找到所有涉及name'ben'的玩家的游戏;他是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 键,但这似乎使其他查询更难)。

所以我不确定在这种情况下最好的策略是什么......

【问题讨论】:

  • 你解决了吗?

标签: python mongodb


【解决方案1】:

最简单的方法是将玩家添加到一个数组中。

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

要查找杰克参加的所有比赛,

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

在我看来,如果每个玩家都是长度为 2 的数组中的一个对象,您将拥有更自然的结构,并且您可以执行与上述类似的查询来查找涉及给定玩家的所有匹配项,但是您说这会使其他查询更加困难。你没有说这些是什么查询,所以我无法帮助你,但是添加一个只包含名称的额外数组应该会有所帮助。

【讨论】:

    【解决方案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))
    

    您可以将结果分配给列表或字典,而不是“打印”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多