作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 mongodb 3.4.5 aggregate
, 有以下文件:
{id:1, a:['x','y','z'], b:[2,3,4]}
{id:1, field: [{a:'x', b:2}, {a:'y', b:3}, {a:'z', b:4}]}
aggregate
阶段?
最佳答案
你真的想要 $zip
和 $arrayElemAt
内 $map
这里:
db.collection.aggregate([
{ "$project": {
"field": {
"$map": {
"input": { "$zip": { "inputs": [ "$a", "$b" ] } },
"as": "el",
"in": {
"a": { "$arrayElemAt": [ "$$el", 0 ] },
"b": { "$arrayElemAt": [ "$$el", 1 ] }
}
}
}
}}
])
{
"field" : [
{
"a" : "x",
"b" : 2
},
{
"a" : "y",
"b" : 3
},
{
"a" : "z",
"b" : 4
}
]
}
$zip
“成对”和
$map
使用
$arrayElemAt
处理每一对为新键取每个索引。
$arrayToObject
和
$objectToArray
:
db.collection.aggregate([
{ "$project": {
"field": {
"$map": {
"input": { "$objectToArray": {
"$arrayToObject": {
"$zip": { "inputs": [ "$a", "$b" ] }
}
}},
"as": "el",
"in": { "a": "$$el.k", "b": "$$el.v" }
}
}
}}
])
$zip
无论如何都是成对的,所以我们已经知道结果是“成对”的
0
和
1
索引。
$zip
创建对:
{ "$project": {
"_id": 0,
"field": { "$zip": { "inputs": [ "$a", "$b" ] } }
}}
{ "field" : [ [ "x", 2 ], [ "y", 3 ], [ "z", 4 ] ] }
$map
从这里应该是不言而喻的,所以我们展示了
$arrayToObject
步:
{ "$project": {
"field": { "$arrayToObject": "$field" }
}}
{ "field" : { "x" : 2, "y" : 3, "z" : 4 } }
$objectToArray
的变换:
{ "$project": {
"field": { "$objectToArray": "$field" }
}}
"k"
和
"v"
:
{
"field" : [
{ "k" : "x", "v" : 2 },
{ "k" : "y", "v" : 3 },
{ "k" : "z", "v" : 4 }
]
}
$map
重命名“键”:
{ "$project": {
"field": {
"$map": {
"input": "$field",
"as": "el",
"in": { "a": "$$el.k", "b": "$$el.v" }
}
}
}}
{
"field" : [
{ "a" : "x", "b" : 2 },
{ "a" : "y", "b" : 3 },
{ "a" : "z", "b" : 4 }
]
}
db.collection.aggregate([
{ "$project": {
"_id": 0,
"field": { "$zip": { "inputs": [ "$a", "$b" ] } }
}},
{ "$project": {
"field": { "$arrayToObject": "$field" }
}},
{ "$project": {
"field": { "$objectToArray": "$field" }
}},
{ "$project": {
"field": {
"$map": {
"input": "$field",
"as": "el",
"in": { "a": "$$el.k", "b": "$$el.v" }
}
}
}}
])
db.collection.find().map(doc => {
doc.field = doc.a.map((e,i) => [e, doc.b[i]]).map(e => ({ a: e[0], b: e[1] }));
delete doc.a;
delete doc.b;
return doc;
})
db.collection.find().map(({ a, b }) =>
({ field: a.map((e,i) => [e, b[i]]).map(([a,b]) => ({ a, b })) })
)
db.collection.find().map(({ a, b }) =>
({ field: a.map((a,i) => ({ a, b: b[i] })) })
)
关于mongodb - 如何将两个数组连接成一个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613722/
我是一名优秀的程序员,十分优秀!