как найти записи во вложенном документе в mongodb - PullRequest
0 голосов
/ 06 февраля 2020

Вот примеры записей коллекции my_list, которая содержит многоуровневые вложенные документы, как найти соответствующее значение «ключа» из записи, которая содержит подзапись 3rd_party_setting и с 3rd_party_id="123456"? т.е. найти значение ключа с соответствующим 3rd_party_setting.3rd_party_id ="123456"

[
  {
    "_id": 551,
    "name": "demo1",
    "groups": {
      "123": {
        "name": "group1",
        "teams": {
          "110": {
            "name": "team1",
            "team_id": "2322"
          },
          "111": {
            "name": "team1",
            "team_id": "2322"
          }
        },
        "3rd_party_setting": {
          "3rd_party_id": "123456",
          "key": "this is the key",
          "create_dt": "2020-02-06 01:27:19",
          "update_dt": "2020-02-06 01:27:19"
        }
      }
    }
  },
  {
    "_id": 552,
    "name": "demo2",
    "groups": {
      "124": {
        "name": "group2",
        "teams": {
          "210": {
            "name": "team1",
            "team_id": "2322"
          },
          "211": {
            "name": "team1",
            "team_id": "2322"
          }
        },
        "3rd_party_setting": {
          "3rd_party_id": "123458",
          "key": "this is the key2",
          "create_dt": "2020-02-06 01:27:19",
          "update_dt": "2020-02-06 01:27:19"
        }
      }
    }
  },
  {
    "_id": 555,
    "name": "demo3",
    "groups": {
      "125": {
        "name": "group3",
        "teams": {
          "310": {
            "name": "team3",
            "team_id": "2322"
          },
          "311": {
            "name": "team3",
            "team_id": "2322"
          }
        }
      }
    }
  }
]

1 Ответ

1 голос
/ 06 февраля 2020

Вы можете получить то, что ищете, используя агрегацию.

Этот конвейер агрегации:

db.collection.aggregate([
  {
    $project: {
      o: {
        $objectToArray: "$groups"
      }
    }
  },
  {
    $match: {
      "o.v.3rd_party_setting.3rd_party_id": "123456"
    }
  },
  {
    $project: {
      key: "$o.v.3rd_party_setting.key"
    }
  }
])
  1. использует $ objectToArray в поле groups, чтобы разбить его на k и v для проверки содержимого независимо от имени ключа
  2. $ match в проекте 3rd_party_id
  3. $ для возврата только нужного ключа

Если у вас есть документы с более чем 1 группой, вам может потребоваться $ раскручивать перед сопоставлением.

Пример Детская площадка

...