我有这样的数组:
"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"
。
有没有办法达到我想要的结果?
答案 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"
}
}
}