Машинописный текст: pu sh несколько объектов для одного и того же ключа динамически - PullRequest
0 голосов
/ 11 марта 2020

Я работаю над новым проектом, используя expressjs + MongoDB + машинопись .

Коллекция после выполнения mon go query:

[{
    "_id": 1,
    "mixerId": 1,
    "mixerName": "Tejuino",
    "mixerType": "1",
    "price": 0,
    "isActive": 1
},
{
    "_id": 2,
    "mixerId": 1,
    "mixerName": "Izze",
    "price": 0,
    "mixerType": "1",
    "isActive": 1
},

{
    "_id": 1,
    "mixerId": 2,
    "mixerName": "REGULAR SODA",
    "mixerType": "2",
    "price": 0,
    "isActive": 1
},
{
    "_id": 2,
    "mixerId": 2,
    "mixerName": "Fanta Grape",
    "mixerType": "2",
    "price": 0,
    "isActive": 1
}, {
    "_id": 1,
    "mixerId": 3,
    "mixerName": "GIN & BITTER LEMON",
    "mixerType": "3",
    "price": 0,
    "isActive": 1
}]

Я хочу преобразовать эту структуру в формат ниже, используя машинопись:

  {
    "juices" : [ 
        {
            "_id" : 1,
            "mixerId" : 1,
            "mixerName" : "Tejuino",
            "price" : 0,
            "isActive" : 1
        }, 
        {
            "_id" : 2,
            "mixerId" : 1,
            "mixerName" : "Izze",
            "price" : 0,
            "isActive" : 1
        }
    ],
    "soda" : [ 
        {
            "_id" : 1,
            "mixerId" : 2,
            "mixerName" : "REGULAR SODA",
            "price" : 0,
            "isActive" : 1
        }, 
        {
            "_id" : 2,
            "mixerId" : 2,
            "mixerName" : "Fanta Grape",
            "price" : 0,
            "isActive" : 1
        }
    ],
    "others" : [ 
        {
            "_id" : 1,
            "mixerId" : 3,
            "mixerName" : "GIN & BITTER LEMON",
            "price" : 0,
            "isActive" : 1
        }
    ]
}

Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 11 марта 2020

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

db.collection.aggregate([
    /** group on mixerType & push docs to v field */
    {
        $group: {
            _id: "$mixerType",
            v: {
                $push: "$$ROOT"
            }
        }
    },
    /** Using switch rename _id values to actual names & push to k field */
    {
        $project: {
            k: {
                $switch: {
                    branches: [
                        { case: { $eq: ["1", "$_id"] }, then: "juices" },
                        { case: { $eq: ["2", "$_id"] }, then: "soda" }
                    ],
                    default: "others"
                }
            },
            _id: 0,
            v: 1
        }
    },
    /** As we've docs in form of {K:..., v:...} use arrayToObject to convert those to an object type &
     *  to data field */
    {
        $project: {
            data: {
                $arrayToObject: [
                    [
                        "$$ROOT"
                    ]
                ]
            }
        }
    },
    /** Make data field as new root for each doc */
    {
        $replaceRoot: {
            newRoot: "$data"
        }
    }
])

Тест: MongoDB-Playground

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