我想使用聚合功能将文档数组展平为键对象。这是我的文档的示例:
gitattributes
预期结果:
filter
我看过不同的运算符,例如[
{
"_id": 1,
"texts": [
{ "language": "english", "text": "hello" },
{ "language": "german", "text": "hallo" },
{ "language": "french", "text": "bonjour" }
]
}, …
]
,但这似乎是在将数组转换为数组时出现的。我可能需要等价于[
{
"_id": 1,
"texts": {
"english": "hello",
"german": "hallo",
"french": "bonjour"
}
}, …
]
的JS,但是找不到将我的值累积到对象中的方法。
有什么想法吗?
答案 0 :(得分:2)
您可以在mongodb 3.4.4 及更高版本
中使用$map
和$arrayToObject
聚合来尝试此操作
只需使用$map
将具有键(k)的language
字段和具有值(v)的文本转换,然后使用$arrayToObject
将数组转换为对象即可
db.collection.aggregate([
{ "$addFields": {
"texts": {
"$map": {
"input": "$texts",
"in": {
"k": "$$this.language",
"v": "$$this.text"
}
}
}
}},
{ "$addFields": {
"texts": { "$arrayToObject": "$texts" }
}}
])
答案 1 :(得分:2)
您需要$map和$arrayToObject来将k-v对数组转换为单个对象:
db.col.aggregate([
{
$addFields: {
texts: {
$arrayToObject: {
$map: {
input: "$texts",
as: "text",
in: {
k: "$$text.language",
v: "$$text.text"
}
}
}
}
}
}
])
答案 2 :(得分:2)
您还可以将$zip
与$arrayToObject
结合使用。
类似
db.col.aggregate([{
"$project": {
"texts":{
"$arrayToObject":{
"$zip": {
"inputs": [
"$texts.language",
"$texts.text"
]
}
}
}}
}])