是否可以使用arrayToObject将objectsID数组转换为mongoDB中的对象?

时间:2021-03-01 11:16:12

标签: mongodb mongodb-query aggregate

我有这样的数组:

"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"

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

1 个答案:

答案 0 :(得分:1)

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

$arrayToObject 处理格式如下的数组:

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

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

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

现在您可以使用 $arrayToObject

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

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