MongoDB: Найти дубликаты документов, где поле имеет самые низкие значения - PullRequest
2 голосов
/ 08 марта 2020

поэтому у меня есть эта проблема

У меня есть эта дубликат коллекции, который выглядит следующим образом:

{name: "a", otherField: 1, _id: "id1"},
{name: "a", otherField: 2, _id: "id2"},
{name: "a", otherField: 3, _id: "id3"},
{name: "b", otherField: 1, _id: "id4"}
{name: "b", otherField: 2, _id: "id5"}

Моя цель - получить идентификатор с меньшим количеством otherField, которое будет выглядеть так:

{"name": "a", _id: "id1"},
{"name": "a", _id: "id2"},
{"name": "b", _id: "id4"}

Поскольку старшее otherField из a и b равно "id3" и "id5", я хочу, чтобы id отличался от самого высокого otherField

Как этого добиться с помощью запроса в mongodb?

Спасибо

1 Ответ

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

Вы можете попробовать запрос ниже:

db.collection.aggregate([
    /** group all docs based on name & push docs to data field & find max value for otherField field */
    {
        $group: {
            _id: "$name",
            data: {
                $push: "$$ROOT"
            },
            maxOtherField: {
                $max: "$otherField"
            }
        }
    },
    /** Recreate data field array with removing doc which has max otherField value */
    {
        $addFields: {
            data: {
                $filter: {
                    input: "$data",
                    cond: {
                        $ne: [
                            "$$this.otherField",
                            "$maxOtherField"
                        ]
                    }
                }
            }
        }
    },
    /** unwind data array */
    {
        $unwind: "$data"
    },
    /** Replace data field as new root for each doc in coll */
    {
        $replaceRoot: {
            newRoot: "$data"
        }
    }
])

Тест: MongoDB-Playground

Примечание: Мы может склоняться к сортировке документов по полю otherField , но это не предпочтительно для огромных наборов данных.

...