Объединить объекты в коллекции, где поля одинаковы - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь объединить и обновить объекты, в которых 4 поля (имя, панель, раздел, подраздел) совпадают.

т.е.

Данные объединены 1: name = 'Field Handbook v1.1' и section = 'customer' и subsection = 'manual' и panel = 'Revolution Series (R3 Series)'

Данные объединены 2: name = 'Field Handbook v1.1' и section = 'customer' и subsection = 'manual' and panel = 'Eco-Safe Digester (E3 Series)'

Исходные объекты

{
    "_id" : ObjectId("5d35e1fd02819f105326c84e"),
    "deleted" : false,
    "files" : [
        {
            "ext" : "pdf",
            "file" : "Revolution Series Digester Field Handbook R3 Series v1.1 150 DPI.pdf"
        }
    ],
    "name" : "Field Handbook v1.1",
    "section" : "customer",
    "subsection" : "manuals",
    "tags" : [
        "customer",
        "manuals"
    ],
    "panel" : "Revolution Series (R3 Series)"
}


{
    "_id" : ObjectId("5d35e1fd02819f105326c851"),
    "deleted" : false,
    "files" : [
        {
            "ext" : "link",
            "file" : "http://docs.biohitech.com/r3/handbook"
        }
    ],
    "name" : "Field Handbook v1.1",
    "section" : "customer",
    "subsection" : "manuals",
    "tags" : [
        "customer",
        "manuals"
    ],
    "panel" : "Revolution Series (R3 Series)"
}


{
    "_id" : ObjectId("5d35e1fd02819f105326c856"),
    "deleted" : false,
    "files" : [
        {
            "ext" : "pdf",
            "file" : "Eco-Safe Digester Field Handbook E3 Series v1.1 150 DPI.pdf"
        }
    ],
    "name" : "Field Handbook v1.1",
    "section" : "customer",
    "subsection" : "manuals",
    "tags" : [
        "customer",
        "manuals"
    ],
    "panel" : "Eco-Safe Digester (E3 Series)"
}


{
    "_id" : ObjectId("5d35e1fd02819f105326c857"),
    "deleted" : false,
    "files" : [
        {
            "ext" : "link",
            "file" : "http://docs.biohitech.com/e3/handbook/"
        }
    ],
    "name" : "Field Handbook v1.1",
    "section" : "customer",
    "subsection" : "manuals",
    "tags" : [
        "customer",
        "manuals"
    ],
    "panel" : "Eco-Safe Digester (E3 Series)"
}

Ожидаемые результаты

{
    "_id" : ObjectId("5d35e1fd02819f105326c84e"),
    "deleted" : false,
    "files" : [
        {
            "ext" : "pdf",
            "file" : "Revolution Series Digester Field Handbook R3 Series v1.1 150 DPI.pdf"
        },
        {
            "ext" : "link",
            "file" : "http://docs.biohitech.com/r3/handbook"
        }
    ],
    "name" : "Field Handbook v1.1",
    "section" : "customer",
    "subsection" : "manuals",
    "tags" : [
        "customer",
        "manuals"
    ],
    "panel" : "Revolution Series (R3 Series)"
}


{
    "_id" : ObjectId("5d35e1fd02819f105326c856"),
    "deleted" : false,
    "files" : [
        {
            "ext" : "pdf",
            "file" : "Eco-Safe Digester Field Handbook E3 Series v1.1 150 DPI.pdf"
        },
        {
            "ext" : "link",
            "file" : "http://docs.biohitech.com/e3/handbook/"
        }
    ],
    "name" : "Field Handbook v1.1",
    "section" : "customer",
    "subsection" : "manuals",
    "tags" : [
        "customer",
        "manuals"
    ],
    "panel" : "Eco-Safe Digester (E3 Series)"
}

1 Ответ

1 голос
/ 10 февраля 2020

Вы можете попробовать это:

 db.collection.aggregate([
    {
        $unwind: {
            path: "$files",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $group: {
            _id: {
                "name": "$name",
                "section": "$section",
                "subsection": "$subsection",
                "panel": "$panel"
            },
            data: {
                $first: "$$ROOT"
            },
            files: {
                $push: "$files"
            }
        }
    },
    {
        $addFields: {
            "data.files": "$files"
        }
    },
    {
        $replaceRoot: {
            newRoot: "$data"
        }
    },
    /** writes to new collection named 'collection_new' will override collection if that name already exists */
    { $out: "collection_new" }
])

Тест: MongoDB-Playground

Как только вы почувствуете, что данные хороши в collection_new тогда вам может понадобиться удалить существующую коллекцию и переименовать ее в старое / реальное имя, также проверьте наличие индексов. В случае, если вы можете обновить до >4.2, тогда вы можете использовать $ merge , который будет добавлять документы в существующую коллекцию, которая намного чище в использовании.

...