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

如果有人能帮我写一个查询,我可以得到指定的 markerplayer_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”]})