Select 文档中的多个值
Select multiple values from a document
背景
我有以下格式存储的数据
{
"player_id": "VU3R5HNTAGMK",
"markers": {
"BICF2P964092": "GC",
"BICF2G630653981": "CG",
"BICF2P483996": "CT",
"BICF2S23452916": "CG",
"chr26_19147949": "TC",
}
}
你可以想象我为多个玩家存储了数据,每个玩家都有一个唯一的 player_id
并且他们都有不同数量的标记和不同的标记值。
在上面的例子中,一个标记是 BICF2P964092
并且它的标记值是 GC
.
我正在尝试以各种方式查询我的 mongo 数据库。一种明显的方法是使用 player_id。为此,我执行以下操作 col.find({"player_id": "VU3R5HNTAGMK"})
我想做的另一件事是也许我只想知道特定标记对特定玩家的价值。为此,我可以执行以下操作 col.find({"player_id": "VU3R5HNTAGMK"}, {'markers.BICF2P964092'})
问题
我还希望能够获取特定玩家的多个标记的值,但我无法这样做。我尝试了以下但没有成功。
col.find({"player_id": "VU3R5HNTAGMK"},{'markers': {'$in': ["BICF2P964092", "chr26_19147949"]}})
col.find({"player_id": "VU3R5HNTAGMK"}, {'markers.BICF2P964092'}, {'markers.chr26_19147949'})
如果有人能帮我写一个查询,我可以得到指定的 marker
和 player_id
的多个标记值,我将不胜感激
当你标记这个pymongo时,你最好在找到后处理python中的标记值;例如
docs = col.find({"player_id": "VU3R5HNTAGMK"})
for doc in docs:
for marker, value in doc.get('markers').items():
if marker in ["BICF2P964092", "chr26_19147949"]:
print(marker, value)
@Belly Buster 解决方案很好,如果你想使用 python 来处理这个问题。
但是,有一种方法可以使用聚合在 MongoDB 端完全处理这个问题。
您可以在 $project
阶段组合 $objectToArray
、$filter
和 $arrayToObject
运算符。
collection.aggregate([
{
"$match": {
"player_id": "VU3R5HNTAGMK" # <-- All your match conditons
}
},
{
"$project": {
"player_id": 1, # All the other keys which you want to project
"markers": {
"$arrayToObject": {
"$filter": {
"input": {
"$objectToArray": "$markers"
},
"as": "elem",
"cond": {
"$in": [
"$$elem.k",
[
# <-- List of key names you want to project
"BICF2G630653981",
"BICF2P483996"
]
]
},
},
},
},
}
},
])
Note: You have to use MongoDB version >= 3.4.4 for this aggregation query to work.
您可以简单地执行以下操作
col.find({“player_id”: “VU3R5HNTAGMK”}, {“markers.” + m: 1 for m in [“ BICF2P964092", “BICF2G630653981”]})
背景
我有以下格式存储的数据
{
"player_id": "VU3R5HNTAGMK",
"markers": {
"BICF2P964092": "GC",
"BICF2G630653981": "CG",
"BICF2P483996": "CT",
"BICF2S23452916": "CG",
"chr26_19147949": "TC",
}
}
你可以想象我为多个玩家存储了数据,每个玩家都有一个唯一的 player_id
并且他们都有不同数量的标记和不同的标记值。
在上面的例子中,一个标记是 BICF2P964092
并且它的标记值是 GC
.
我正在尝试以各种方式查询我的 mongo 数据库。一种明显的方法是使用 player_id。为此,我执行以下操作 col.find({"player_id": "VU3R5HNTAGMK"})
我想做的另一件事是也许我只想知道特定标记对特定玩家的价值。为此,我可以执行以下操作 col.find({"player_id": "VU3R5HNTAGMK"}, {'markers.BICF2P964092'})
问题
我还希望能够获取特定玩家的多个标记的值,但我无法这样做。我尝试了以下但没有成功。
col.find({"player_id": "VU3R5HNTAGMK"},{'markers': {'$in': ["BICF2P964092", "chr26_19147949"]}})
col.find({"player_id": "VU3R5HNTAGMK"}, {'markers.BICF2P964092'}, {'markers.chr26_19147949'})
如果有人能帮我写一个查询,我可以得到指定的 marker
和 player_id
当你标记这个pymongo时,你最好在找到后处理python中的标记值;例如
docs = col.find({"player_id": "VU3R5HNTAGMK"})
for doc in docs:
for marker, value in doc.get('markers').items():
if marker in ["BICF2P964092", "chr26_19147949"]:
print(marker, value)
@Belly Buster 解决方案很好,如果你想使用 python 来处理这个问题。
但是,有一种方法可以使用聚合在 MongoDB 端完全处理这个问题。
您可以在 $project
阶段组合 $objectToArray
、$filter
和 $arrayToObject
运算符。
collection.aggregate([
{
"$match": {
"player_id": "VU3R5HNTAGMK" # <-- All your match conditons
}
},
{
"$project": {
"player_id": 1, # All the other keys which you want to project
"markers": {
"$arrayToObject": {
"$filter": {
"input": {
"$objectToArray": "$markers"
},
"as": "elem",
"cond": {
"$in": [
"$$elem.k",
[
# <-- List of key names you want to project
"BICF2G630653981",
"BICF2P483996"
]
]
},
},
},
},
}
},
])
Note: You have to use MongoDB version >= 3.4.4 for this aggregation query to work.
您可以简单地执行以下操作
col.find({“player_id”: “VU3R5HNTAGMK”}, {“markers.” + m: 1 for m in [“ BICF2P964092", “BICF2G630653981”]})