Mongodb 在批量操作中将匿名对象数组重新构造为mongo中的命名密钥对象
我有一份像这样的文件Mongodb 在批量操作中将匿名对象数组重新构造为mongo中的命名密钥对象,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一份像这样的文件 { name:'John Doe', phone: 'XXXXXXX', field1: [ {I:20}, {J:60}, {K:20} ] } 如何重新构造字段1,使其具有名称,而不是匿名。大概是这样的: field1: [ { key: I, value:20 }, { key: J, value:60 }, { key: K, value:20 } ]
{
name:'John Doe',
phone: 'XXXXXXX',
field1: [
{I:20},
{J:60},
{K:20}
]
}
如何重新构造字段1
,使其具有名称,而不是匿名。大概是这样的:
field1: [
{
key: I,
value:20
},
{
key: J,
value:60
},
{
key: K,
value:20
}
]
因为我有大量的数据,所以也可以进行批量操作。您可以使用两种方法进行操作
- 第一个
管道,用于将对象转换为$set
和k
格式的数组v
- 第二个
管道,用于从$set
和k=>key
v=>value
使用
aggregate()
和$out
- 两个
与上述方法相同$set
获取聚合管道返回的文档并将其写入指定的集合$out
db.collection.aggregate([
{
$set:{
字段1:{
美元减少:{
输入:“$field1”,
初始值:[],
在:{
$concatarray:[
“$$value”,
{
$objectToArray:“$$this”
}
]
}
}
}
}
},
{
$set:{
字段1:{
$map:{
输入:“$field1”,
作为:“f”,
在:{
密钥:“$$f.k”,
值:“$$f.v”
}
}
}
}
},
{$out:}
])
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"
}
}
}
}
}
]
)
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"> }
])