Mongodb: вытащить вложенный документ из документа

Моя схема базы данных выглядит так:

{
"_id" : 137,
"name" : "Tamika Schildgen",
"scores" : [
    {
        "score" : 4.433956226109692,
        "type" : "exam"
    },
    {
        "type" : "quiz",
        "score" : 65.50313785402548
    },
    {
        "type" : "homework",
        "score" : 89.5950384993947
    },
    {
        "type" : "homework",
        "score" : 54.75994689226145
    }
]
}

 Bson filter = (Filters.eq("scores.type", "homework"));
    Bson projection = Projections.slice("scores", 2, 2);
    Bson sort = Sorts.ascending("_id");
    List<Document> all = collection.find(filter).projection(projection).sort(sort).into(new ArrayList<Document>());
    for (Document cur : all) {
        List<Document> score = (List<Document>) cur.get("scores");
        List marks = new ArrayList<Integer>();
        for (Document hw1 : score) {
            marks.add(hw1.get("score"));
        }
        Collections.sort(marks);
        double x = (Double) marks.get(0);

        Bson find = Filters.eq("_id", cur.get("_id"));
        Bson update = new Document("$pull", new Document("scores", new Document("scores.type", "homework").append("scores.score" , x)));
        collection.updateOne(find,update);
        System.out.println("deleted " + cur.get("_id") + " " + x);

В вопросах предлагается убрать наименьшее количество домашних заданий для каждого учащегося. Мой подход:

  • сначала получите список документов, содержащих только идентификаторы и домашние задания студентов.
  • Получите минимальный балл за каждого студента.
  • Вытащите вложенный документ, содержащий этот минимальный домашний балл.

Мои распечатки правильно показывают минимальное домашнее задание для каждого учащегося, но мой запрос не удаляет значения из базы данных. Что мне здесь не хватает? Не спрашивая решения, нам поможет только намек на то, что я делаю неправильно. Благодарю.

1 ответ

Решение

В вашем коде требуется небольшая коррекция, которую вы пытаетесь удалить

{"scores.type":"домашняя работа", "Scores.score":"все что угодно"}

и вы должны удалить поддокумент

{"type":"homework", "score":"..."}

Другие вопросы по тегам