MongoDB $ результат поиска в виде объекта вместо массива - PullRequest
0 голосов
/ 23 декабря 2018

Таблица "пользователь":

{
    "_id" : ObjectId("573b09e6322304d5e7c6256e"),
    "name" : "John",
    "age" : 30,
    "list" : [ 
        "userId1", 
        "userId2", 
        "userId3", 
        "userId2"
    ]
},
{
    "_id" : "userId1",
    "name" : "Derek",
    "age" : 34
},
{
    "_id" : "userId2",
    "name" : "Homer",
    "age" : 44
},
{
    "_id" : "userId3",
    "name" : "Bobby",
    "age" : 12
}

Мой запрос:

db.user.aggregate(
    [
        {
            $match: { "_id": ObjectId("573b09e6322304d5e7c6256e") }
        },
        {
            $lookup:
            {
                from: "user",
                localField: "list",
                foreignField: "_id",
                as: "listData"
            }
        }
    ]
)

Мне нужно найти одного пользователя по идентификатору с данными объединенного списка в качестве объекта идентификатора / значения:

{
    "_id" : ObjectId("573b09e6322304d5e7c6256e"),
    "name" : "John",
    "age" : 30,
    "list" : [ 
        "userId1", 
        "userId2", 
        "userId3", 
        "userId2"
    ],
    "listData" : {
        "userId1": {
            "_id" : "userId1",
            "name" : "Derek",
            "age" : 34
        }, 
        "userId2": {
            "_id" : "userId2",
            "name" : "Homer",
            "age" : 44
        }, 
        "userId3": {
            "_id" : "userId3",
            "name" : "Bobby",
            "age" : 12
        }
    ]
}

Но я получил listData в виде массива:

{
    "_id" : ObjectId("573b09e6322304d5e7c6256e"),
    "name" : "John",
    "age" : 30,
    "list" : [ 
        "userId1", 
        "userId2", 
        "userId3", 
        "userId2"
    ],
    "listData" : [ 
        {
            "_id" : "userId1",
            "name" : "Derek",
            "age" : 34
        }, 
        {
            "_id" : "userId2",
            "name" : "Homer",
            "age" : 44
        }, 
        {
            "_id" : "userId3",
            "name" : "Bobby",
            "age" : 12
        }
    ]
}

Что мне нужно изменить, чтобы получить массив как объект с ключами в качестве идентификаторов?дБ версия v4.0.2

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете использовать $ addFields , чтобы превратить listData в объект.Перед этим вы должны использовать $ map для преобразования массива в массив пар kv, а затем вы можете использовать $ arrayToObjec t для динамического создания новых ключей, попробуйте:

db.col.aggregate([
    {
            $match: { "_id": ObjectId("573b09e6322304d5e7c6256e") }
    },
    {
        $lookup:
        {
            from: "user",
            localField: "list",
            foreignField: "_id",
            as: "listData"
        }
    },
    {
        $addFields: {
            listData: {
                $arrayToObject: {
                    $map: {
                        input: "$listData",
                        as: "user",
                        in: {
                            k: "$$user._id",
                            v: "$$user"
                        }
                    }
                }
            }
        }
    }
])
...