Первый аргумент $ arrayElemAt должен быть массивом - PullRequest
0 голосов
/ 01 июня 2018

Я извлекаю набор записей из коллекции и объединяюсь с другой коллекцией.

Я хотел бы добавить поле в проецируемое поле, но я получаю сообщение об ошибке - код и ошибка ниже:

db.getCollection("ConnectionEntity").aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                "Id":"9c06cb0c-966a-4f6b-b087-816587629079"
            }
        },

        // Stage 2
        {
            $lookup: // Equality Match
            {
                from: "Enterprise",
                localField: "EnterpriseId",
                foreignField: "_id",
                as: "joined"
            }
        },

        // Stage 3
        {
            $project: {                 
                "Enterprise": {"$arrayElemAt": ["$joined.Profile", 0]}
            }
        },

        // Stage 4 - doesn't work
        {
            $addFields: {
                "Enterprise.Id": {"$arrayElemAt": ["$joined._id", 0]}
            }
        },
    ]
);

Ошибка:

The following error occurred while attempting to execute the aggregate query

Mongo Server error (MongoCommandException): Command failed with error 28689: '$arrayElemAt's first argument must be an array'.

The full response is:
{ 

    "_t" : "OKMongoResponse", 

    "ok" : NumberInt(0), 

    "code" : NumberInt(28689), 

    "errmsg" : "$arrayElemAt's first argument must be an array", 

    "$err" : "$arrayElemAt's first argument must be an array"

}

1 Ответ

0 голосов
/ 01 июня 2018

В вашем коде Stage 4 пытается сослаться на массив joined, который помещается в Stage 3 (вы проецируете только поле Enterprise и _id неявно).Есть много способов исправить это, например, вы можете использовать $addFields в Stage 4, чтобы сохранить массив joined и удалить его позже:

db.ConnectionEntity.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                "Id":"9c06cb0c-966a-4f6b-b087-816587629079"
            }
        },

        // Stage 2
        {
            $lookup: // Equality Match
            {
                from: "Enterprise",
                localField: "EnterpriseId",
                foreignField: "_id",
                as: "joined"
            }
        },

        // Stage 3
        {
            $addFields: {                 
                "Enterprise": {"$arrayElemAt": ["$joined.Profile", 0]}
            }
        },

        // Stage 4
        {
            $addFields: {
                "Enterprise.Id": {"$arrayElemAt": ["$joined._id", 0]}
            }
        },

        //get rid of joined if it's no longer useful
        {
           $project: {
               joined: 0
           }
        }
    ]
);
...