Mon go DB сравнить два массива и добавить отсутствующий элемент - PullRequest
1 голос
/ 24 апреля 2020

У меня есть массив состояний, как показано ниже.

"statuses" : [
        {
            "name" : "In Progress",
            "created_on" : ISODate("2020-04-20T19:00:07.681Z")
        },
        {
            "name" : "Pending",
            "created_on" : ISODate("2020-04-20T19:00:07.886Z")
        },
        {
            "name" : "Viewed",
            "created_on" : ISODate("2020-04-20T20:10:04.733Z")
        },
        {
            "name" : "Initial Viewed",
            "created_on" : ISODate("2020-04-20T20:10:08.468Z")
        },
        {
            "name" : "Opened",
            "created_on" : ISODate("2020-04-21T01:37:08.582Z")
        },
        {
            "name" : "Completed",
            "created_on" : ISODate("2020-04-21T01:48:46.007Z")
        }
    ]

У меня есть еще один массив, с которым:

"reference": ['In Progress', 'Pending', 'Sent', 'Initial Viewed', 'Viewed', 'Opened', 'Completed']

Как видно, когда я сравниваю свой первый массив со ссылкой массив «Отправлено» отсутствует в первом массиве, который я хотел бы добавить в мой первый массив с текущей функцией ISODate (). А также я хочу, чтобы мой первый массив был в том же порядке, что и второй.

1 Ответ

2 голосов
/ 24 апреля 2020

Запустив $ map на reference, вы получите желаемый заказ. $ filter вместе с $ arrayElemAt позволит вам найти один соответствующий элемент, а $ ifNull можно использовать для создания нового объекта, когда нет соответствия:

db.collection.aggregate([
    {
        $project: {
            result: {
                $map: {
                    input: "$reference",
                    as: "ref",
                    in: {
                        $let: {
                            vars: {
                                matched: {
                                    $arrayElemAt: [ { $filter: { input: "$statuses", cond: { $eq: [ "$$ref", "$$this.name" ] } } }, 0 ]
                                }
                            },
                            in: {
                                $ifNull: [ "$$matched", { name: "$$ref", created_on: new Date() } ]
                            }
                        }
                    }
                }
            }
        }
    }
])

Пн go Детская площадка

...