mongodb получить вложенный сегмент данных объекта - PullRequest
1 голос
/ 28 апреля 2020

моя структура данных выглядит так:

{
    "_id": xxxxx
    "user": "username",
    "data": {
        "21-04-2020": {
            "Study": "1:00:12",
            "other": "2:00:23"
        },
        "22-04-2020": {
            "study": "1:23:11",
            "other": "3:33:22"
        },

    }
}

Я хочу написать запрос, чтобы получить данные за определенный день (например, только 22-04-2020). Я пробовал запрос как:

 db.activity.find({'user':'username','data.22-04-2020':{$exists:true})

но он предоставляет мне все данные документов, такие как

{ "_id" : ObjectId("5ea80f4151f5b94b73ba0327"), "user" : "username", "data" : { "21-04-2020" : { "study" : "1:00:12", "other" : "2:00:23" }, "22-04-2020" : { "study" : "1:23:11", "other" : "3:33:22" }}}

, но я хочу только небольшой сегмент для дня 22-04-2020, например:

{ "study" : "1:23:11", "other" : "3:33:22" }

, так как получить сегмент данных, используя значение ключа

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы можете использовать метод aggregate. Сначала вам нужно match, а затем использовать оператор project, чтобы получить желаемый результат. Попробуйте следующий код:

db.collection.aggregate([
  {
    $match: {
      user: "username",
      "data.22-04-2020": {
        $exists: true
      }
    }
  },
  {
    $project: {
      study: "data.22-04-2020.study",
      other: "data.22-04-2020.other",
      _id: 0
    }
  }
])

MongoPlayGroundLink

0 голосов
/ 28 апреля 2020

Все, что вам нужно добавить к этому запросу, это проекция , чтобы получить из документа только определенные поля:

db.collection.find({ "user": "username", "data.22-04-2020": { $exists: true } },
{ "data.22-04-2020": 1, _id: 0 })

Тест: mongoplayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...