我有这样的结构:
{
"id" : 1,
"user" : "somebody",
"players" : [
{
"name" : "lala",
"surname" : "baba",
"player_place" : "1",
"start_num" : "123",
"results" : {
"1" : { ... }
"2" : { ... },
...
}
},
...
]
}
我对MongoDB还是很陌生,我只是无法弄清楚如何为特定的results
提取user
(在这种情况下为“某人”,但是有许多其他用户,每个用户都有一个数组)的玩家,每个玩家都有很多结果)针对特定的player
和start_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
替换为方法replace
或find_and_replace
)
答案 0 :(得分:1)
您可以替换特定的结果,并且该语法应类似于
假设您要用键1替换结果,
collection.updateOne({
"user": name,
"players.start_num": start_num
},
{ $set: { "players.$.results.1" : new_result }})