mongodb `$ lookup` или` join` с атрибутами внутри массива объектов - PullRequest
1 голос
/ 04 мая 2020

У меня есть этот объект, пришедший из mongodb

[
    {
        "_id": "5eaf2fc88fcee1a21ea0d94d",
        "migration_customer_union_id": 517,
        "__v": 0,
        "account": 1,
        "createdAt": "2020-05-03T20:55:36.335Z",
        "customerUnion": "5eaf2fc7698de8321ccd841d",
        "shaufel_customers": [
            {
                "percent": 50,
                "_id": "5eaf2fc8698de8321ccd881f",
                "customer": "5eaf2fb9698de8321ccd68c0"
            },
            {
                "percent": 50,
                "_id": "5eaf2fc9698de8321ccd8a9d",
                "customer": "5eaf2fb9698de8321ccd68c0"
            }
        ],
    }
]

, который вы можете заметить внутри массива shaufel_customers, есть атрибут с именем customer, который я хочу использовать для соединения с документом клиентов, поэтому я так и делаю (написал этот код с помощью stackoverflow :))

const aggregate = await CustomerUnionCustomer.aggregate(
        [
            {
                $match: {migration_customer_union_id: 517}
            },
            {
                $lookup: {
                    from: 'customers',
                    localField: 'shaufel_customers.customer',
                    foreignField: '_id',
                    as: 'customers',
                }
            },
            {
                $project: {
                    shaufel_customer_union_id: 1,
                    customerUnion: '$customerUnions',
                    shaufel_customers: {
                        $map: {
                            input: "$customers",
                            as: "c",
                            in: {
                                $mergeObjects: [
                                    "$$c",
                                    {
                                        $arrayElemAt: [{
                                            $filter: {
                                                input: "$shaufel_customers",
                                                cond: {$eq: ["$$this.customer", "$$c._id"]}
                                            }
                                        }, 0]
                                    },

                                ]
                            }
                        },

                    }
                }
            },
            {
                "$project": { // this project just to get some specific values inside shaufel_customers
                    '_id': 0,

                    "shaufel_customers": {
                        "$map": {
                            "input": "$shaufel_customers",
                            "as": "customer",
                            "in": {
                                "customer_id": "$$customer.shaufel_customer_id",
                                "percent": "$$customer.percent"
                            }
                        }
                    }
                }
            }

        ]
    )

при выполнении этого кода я получаю следующий ответ

[
    {
        "shaufel_customers": [
            {
                "customer_id": "869",
                "percent": 50
            }
        ]
    }
]

вы можете заметить, что я получил один объект, хотя был два объекта в исходном массиве выше, и это потому, что атрибут customer выше имеет то же значение ObjectId 5eaf2fb9698de8321ccd68c0, и это то, что я хочу спросить. Я хочу получить те же два объекта, даже если идентификаторы одинаковы, поэтому я ожидаю получить следующий результат:

[
    {
        "shaufel_customers": [
            {
                "customer_id": "869",
                "percent": 50
            },
            {
                "customer_id": "869",
                "percent": 50
            },
        ]
    }
]

Как мне это сделать: (

1 Ответ

1 голос
/ 04 мая 2020

Вам нужно вернуть $map и повторить shaufel_customers вместо customer - это вернет два результата:

{
    $project: {
        shaufel_customer_union_id: 1,
        customerUnion: '$customerUnions',
        shaufel_customers: {
            $map: {
                input: "$shaufel_customers",
                as: "sc",
                in: {
                    $mergeObjects: [
                        "$$c",
                        {
                            $arrayElemAt: [{
                                $filter: {
                                    input: "$customers",
                                    cond: {$eq: ["$$this._id", "$$sc.customer"]}
                                }
                            }, 0]
                        },

                    ]
                }
            },

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