使用
我有一个文档,看起来像这个
{
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
}
]
还有可能进行批量操作,因为我有大量数据。
您可以同时使用两种方法,
- 使用MpngoDB 4.2中的聚合管道进行更新
- 使用aggregate((和$out到集合
使用带有聚合管道updateMany((的更新
- 第一个
$set
管道,用于将对象转换为k
和v
格式的数组 - 用于从
k => key
和v => 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"> }
])
游乐场