【问题标题】:$arrayElemAt's first argument must be an array$arrayElemAt 的第一个参数必须是一个数组
【发布时间】:2018-06-01 14:49:52
【问题描述】:

我正在从一个集合中提取一组记录并加入另一个集合。

我想在投影字段中添加一个字段,但出现错误 - 代码和错误如下:

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"

}

【问题讨论】:

  • ConnectionEntity 背后的架构是什么?
  • 你应该发布你的收藏

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

在您的代码中,Stage 4 试图引用 joined 数组,该数组被丢弃在 Stage 3 中(您仅投影 Enterprise 字段和 _id 隐式)。有很多方法可以解决这个问题,例如您可以在Stage 4 中使用$addFields 来保留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
           }
        }
    ]
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2018-08-29
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2017-04-04
    • 2020-08-31
    相关资源
    最近更新 更多