在批量操作中将匿名对象数组重新构造为mongo中的命名密钥对象



我有一个文档,看起来像这个

{
name:'John Doe',
phone: 'XXXXXXX',
field1: [
{I:20},
{J:60},
{K:20}
]
}

如何将field1重组为具有名称而不是匿名。像这样的东西:

field1: [
{
key: I,
value:20
},
{
key: J,
value:60
},
{
key: K,
value:20
}
]

还有可能进行批量操作,因为我有大量数据。

您可以同时使用两种方法,

  1. 使用MpngoDB 4.2中的聚合管道进行更新
  2. 使用aggregate((和$out到集合

使用带有聚合管道updateMany((的更新

  • 第一个$set管道,用于将对象转换为kv格式的数组
  • 用于从k => keyv => value更改名称的第二个$set管道
db.collection.updateMany({},
[{
$set: {
field1: {
$reduce: {
input: "$field1",
initialValue: [],
in: {
$concatArrays: [
"$$value",
{
$objectToArray: "$$this"
}
]
}
}
}
}
},
{
$set: {
field1: {
$map: {
input: "$field1",
as: "f",
in: {
key: "$$f.k",
value: "$$f.v"
}
}
}
}
}
]
)

使用aggregate()$out

  • 两种$set与上述方法相同
  • $out获取聚合管道返回的文档,并将它们写入指定的集合
db.collection.aggregate([
{
$set: {
field1: {
$reduce: {
input: "$field1",
initialValue: [],
in: {
$concatArrays: [
"$$value",
{
$objectToArray: "$$this"
}
]
}
}
}
}
},
{
$set: {
field1: {
$map: {
input: "$field1",
as: "f",
in: {
key: "$$f.k",
value: "$$f.v"
}
}
}
}
},
{  $out: <"collection name"> }
])

游乐场

最新更新