从MongoDB中的字典中提取和更新字典

时间:2019-11-28 22:22:30

标签: python mongodb pymongo

我有这样的结构:

{
    "id" : 1,
    "user" : "somebody",
    "players" : [
        {
            "name" : "lala",
            "surname" : "baba",
            "player_place" : "1",
            "start_num" : "123",
            "results" : {
                "1" : { ... }
                "2" : { ... },
                ...
            }
        },
        ...
    ]
}

我对MongoDB还是很陌生,我只是无法弄清楚如何为特定的results提取user(在这种情况下为“某人”,但是有许多其他用户,每个用户都有一个数组)的玩家,每个玩家都有很多结果)针对特定的playerstart_num

我正在使用pymongo,这是我想出的代码:

record = collection.find(
    {'user' : name}, {'players' : {'$elemMatch' : {'start_num' : start_num}}, '_id' : False}
)

这将为特定用户提取具有特定玩家的players。很好,但是现在我需要从results获取特定结果,如下所示: { 'results' : { '2' : { ... } } }

我尝试过:

record = collection.find(
    {'user' : name}, {'players' : {'$elemMatch' : {'start_num' : start_num}}, 'results' : result_num, '_id' : False}
)

但是那当然不起作用。我可以将其转换为在Python中列出并提取所需的内容,但是我想在Mongo中进行查询。

此外,对于特定用户的特定播放器,我需要怎么做来替换results中的特定结果?假设我有一个键为2的新结果,并且我想替换具有键为2的现有结果。我可以使用与find()相同的查询来做到这一点(只需将方法find替换为方法replacefind_and_replace

1 个答案:

答案 0 :(得分:1)

您可以替换特定的结果,并且该语法应类似于

假设您要用键1替换结果,

collection.updateOne({
  "user": name,
  "players.start_num": start_num
},
{ $set: { "players.$.results.1" : new_result }})