首页 > 解决方案 > 是否可以使用arrayToObject将objectsID数组转换为mongoDB中的对象?

问题描述

我有这样的数组:

"organizationIds" : [ 
       ObjectId("60373852f64bf2cc8c73136d"), 
       ObjectId("60373852f64bf2cc8c73139d"), 
       ObjectId("60373852f64bf2cc8c73138d")
   ]

我想转而反对:

"organization":{
 "ObjectId("60373852f64bf2cc8c73136d")":{
owner: false
 },
 "ObjectId("60373852f64bf2cc8c73138d")":{
owner: false
 }
 "ObjectId("60373852f64bf2cc8c73138d")":{
owner: true
 }
}

我试过使用:

db.getCollection('users').aggregate([{$addFields:{organizationsPermissions:{$arrayToObject:"$organizationIds"}}},])

但我不断得到 error"Unrecognised input type format for $arrayToObject: objectId"

有没有办法达到我想要的结果?

标签: mongodbmongodb-queryaggregate

解决方案


这是使用聚合框架的解决方案。

$arrayToObject适用于格式如下的数组:

[ [ "item", "abc123"], [ "qty", 25 ] ]

因此,首先使用下面的管道将您的organizationIds数组转换为该格式,该管道的使用与$mapJavascript 中的数组映射函数完全相同。也ObjectId不能用作对象键,因此也将其转换为字符串。

{
"$addFields": {
  "organizationIds": {
    $map: {
      input: "$organizationIds",
      as: "org",
      in: {
        $concatArrays: [
          [
            {
              $toString: "$$org"
            }
          ],
          [
            {
              owner: false
            }
          ]
        ]
      },
      
    }
  }
}
}

现在您可以使用$arrayToObject.

{
"$addFields": {
  "organizationIds": {
    "$arrayToObject": "$organizationIds"
  }
}
}

这里的工作示例。https://mongoplayground.net/p/Y8PNyRn7elA


推荐阅读