MongoDB поиск во вложенных документах с динамическими ключами? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть коллекция с такими документами:

{
  "_id": {
    "$oid": "582b5fdf09ecd804b275894c"
  },
  "scriptData": {
    "playerStats": {
      "582b5f9409ecd804b2752bc7": {
        "status": "closed",
        "tileSum": "0"
      },
      "582b6082d20c9404b29d4d6f": {
        "status": "closed",
        "tileSum": "16"
      }
    }
  },
  "startDate": {
    "$date": {
      "$numberLong": "1479237815109"
    }
  },
  "nextPlayer": "582b6082d20c9404b29d4d6f"
}

Я пытаюсь найти каждый документ, где tileSum больше, спасибо 200, но не удалось.Ключи в playerStats являются динамическими.Это идентификатор игрока.

Я пытался так:

db.collection.find({
       "scriptData":{
          "playerStats":{
             "tileSum":{
                "$gt":200
             }
          }
       }
    })

Но я получаю эту ошибку: действие не может быть выполнено.Пожалуйста, проверьте ваши параметры.

Я не уверен, как это сделать, и надеюсь на помощь ...

Заранее спасибо: -)

1 Ответ

0 голосов
/ 03 февраля 2019

Один из возможных способов - обернуть playerStats в массив, а затем использовать $ filter для сравнения в массиве:

Данные:

{
    "_id": {
      "$oid": "582b5fdf09ecd804b275894c"
    },
    "scriptData": {
      "playerStats": [
        {
          "id": "582b5f9409ecd804b2752bc7",
          "status": "closed",
          "tileSum": "0"
        },
        {
          "id": "582b6082d20c9404b29d4d6f",
          "status": "closed",
          "tileSum": "16"
        }
      ]
    },
    "startDate": {
      "$date": {
        "$numberLong": "1479237815109"
      }
    },
    "nextPlayer": "582b6082d20c9404b29d4d6f"
  }

Запрос:

db.collection.aggregate([
  {
    $project: {
      items: {
        $filter: {
          input: "$scriptData.playerStats",
          as: "item",
          cond: {
            $gte: [
              "$$item.tileSum",
              "16"
            ]
          }
        }
      }
    }
  }
])

Результат:

[
  {
    "_id": ObjectId("582b5fdf09ecd804b275894c"),
    "items": [
      {
        "id": "582b6082d20c9404b29d4d6f",
        "status": "closed",
        "tileSum": "16"
      }
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...