mongodb - 是否可以使用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"
。
有没有办法达到我想要的结果?
解决方案
这是使用聚合框架的解决方案。
$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"
}
}
}
推荐阅读
- angular - datePipe Angular 中的 i18n
- c - 在 C 中每第 n 列 (K&R 1-22) 折叠输入行
- linux - 如何将命令的输出(输出是数字)与数字进行比较?尝试查看输出是否大于等于1
- rust - 如何解决 HRTB 错误?
- javascript - 在 Vue.js 中转换数组数组
- hyperledger-fabric - 无法读取超级账本作曲家中未定义的属性“getModelManager”
- linux - 将特定行复制并附加到具有特定名称格式的文件中?
- ios - 将日历格鲁吉亚语更改为波斯语时,无法强制将“NSLocale”类型的值转换为“Locale”类型
- c# - 移动应用程序和 Web 应用程序 API 命中
- javascript - .on 事件未启用点击事件