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

{
    "_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" }

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

1
sanghmitra 28 Апр 2020 в 17:56

2 ответа

Вы можете использовать метод 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
ngShravil.py 28 Апр 2020 в 16:30

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

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

Тест: mongoplayground

0
whoami 28 Апр 2020 в 15:07