Как найти максимальное и минимальное значение из встроенных документов в Mongodb - PullRequest
1 голос
/ 31 марта 2020

Итак, у меня есть json файл:

{"_id":190,"name":"Adrien Renda","scores":[{"score":64.16109192679477,"type":"exam"},{"score":66.93730600935531,"type":"quiz"},{"score":96.0560340227047,"type":"homework"}]}
{"_id":191,"name":"Efrain Claw","scores":[{"score":94.67153825229884,"type":"exam"},{"score":82.30087932110595,"type":"quiz"},{"score":75.86075840047938,"type":"homework"}]}
{"_id":192,"name":"Len Treiber","scores":[{"score":39.19832917406515,"type":"exam"},{"score":98.71679252899352,"type":"quiz"},{"score":44.8228929481132,"type":"homework"}]}
{"_id":193,"name":"Mariela Sherer","scores":[{"score":47.67196715489599,"type":"exam"},{"score":41.55743490493954,"type":"quiz"},{"score":70.4612811769744,"type":"homework"}]}
{"_id":194,"name":"Echo Pippins","scores":[{"score":18.09013691507853,"type":"exam"},{"score":35.00306967250408,"type":"quiz"},{"score":80.17965154316731,"type":"homework"}]}
{"_id":195,"name":"Linnie Weigel","scores":[{"score":52.44578368517977,"type":"exam"},{"score":90.7775054046383,"type":"quiz"},{"score":11.75008382913026,"type":"homework"}]}
{"_id":196,"name":"Santiago Dollins","scores":[{"score":52.04052571137036,"type":"exam"},{"score":33.63300076481705,"type":"quiz"},{"score":78.79257377604428,"type":"homework"}]}
{"_id":197,"name":"Tonisha Games","scores":[{"score":38.51269589995049,"type":"exam"},{"score":31.16287577231703,"type":"quiz"},{"score":79.15856355963004,"type":"homework"}]}
{"_id":198,"name":"Timothy Harrod","scores":[{"score":11.9075674046519,"type":"exam"},{"score":20.51879961777022,"type":"quiz"},{"score":64.85650354990375,"type":"homework"}]}
{"_id":199,"name":"Rae Kohout","scores":[{"score":82.11742562118049,"type":"exam"},{"score":49.61295450928224,"type":"quiz"},{"score":28.86823689842918,"type":"homework"}]}

в коллекции mongodb. И я пытаюсь прочитать максимальный и минимальный балл за последние 5 студентов и показать их. Я использую mongolite в r studio, и я попробовал это:

res2 = con$aggregate(
  '[{"$group":{"_id": "$_id", "MaxScore": {"$max": "$scores.score"}, "MinScore":{"$min":"$scores.score"}}},
  { "$sort" : { "_id" : -1} },
  {"$limit": 5}
  ]'
)

Сортировка и ограничение работают просто отлично, но результаты получаются неверными. Я предполагаю, потому что это встроенные документы, но я не знаю, как это исправить. Это конечный результат вышеприведенной команды result image

1 Ответ

2 голосов
/ 31 марта 2020

Вам не нужно выполнять $group запрос для вычисления $max / $min баллов, вы можете вычислить их во время $project stage

db.collection.aggregate([
  {
    "$project": {
      "_id": 1,
      "MaxScore": {
        "$max": "$scores.score"
      },
      "MinScore": {
        "$min": "$scores.score"
      }
    }
  },
  {
    "$sort": {
      "_id": -1
    }
  },
  {
    "$limit": 5
  }
])

MongoPlayground

Если вы хотите, чтобы $group работал код, просто добавьте перед $group stage $unwind оператор, как показано ниже:

db.collection.aggregate([
  {
    $unwind: "$scores"
  },
  {
    $group: {
      _id: "$_id",
      MaxScore: {
        $max: "$scores.score"
      },
      MinScore: {
        $min: "$scores.score"
      }
    }
  },
  {
    "$sort": {
      "_id": -1
    }
  },
  {
    "$limit": 5
  }
])

MongoPlayground

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