将 $project 中的数组转换为字符串(聚合)

jsc*_*ode 4 mongoose mongodb node.js aggregation-framework

我使用 $project 操作来指定包含的字段我有以下代码:

[{
    '$lookup': {
        'from': 'users',
        'localField': 'owner',
        'foreignField': 'id'
        'as': 'user'
    }
}, {
    '$project': {
        'userName': '$user.username',
        'userId': '$user.id'
    }
}]
Run Code Online (Sandbox Code Playgroud)

我的结果如下:

[
    {
        "userName": [
            "jscode"
        ],
        "userId": [
            "5d1888d60c627764aabd8b1e"
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我需要将userIduserName结果从数组转换为字符串, 如下所示:

[
    {
        "userName": "jscode" ,
        "userId": "5d1888d60c627764aabd8b1e"
    }
]
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Ash*_*shh 8

您可以使用下面的$project阶段

{
  "$project": {
    "userName": { "$arrayElemAt": ["$user.username", 0] },
    "userId": { "$arrayElemAt": ["$user.id", 0] }
  }
}
Run Code Online (Sandbox Code Playgroud)

或使用$unwind

[
  { "$lookup": {
    "from": "users",
    "localField": "owner",
    "foreignField": "id",
    "as": "user"
  }},
  { "$unwind": "$user" },
  { "$project": {
    "userName": "$user.username",
    "userId": "$user.id"
  }}
]
Run Code Online (Sandbox Code Playgroud)

实际上$lookup总是以数组的形式返回新字段。因此,要从该数组中选择字段,您需要使用$unwind或可以$arrayElemAt选择第 0 个元素。