在 mongodb 中展开对象

Jit*_*iya 1 mongodb aggregation-framework

我有一个这样的收藏

[{
    "_id" : ObjectId("590c2331dc1a05e7d3525e70"),
    "name" : "Orange",
    "quarters" : {
        "first" : 20,
        "middle" : 53,
        "last" : 52
    }
}, {
    "_id" : ObjectId("590c2405dc1a05e7d3525e71"),
    "name" : "Apple",
    "quarters" : {
        "first" : 42,
        "middle" : 37,
        "last" : 16
    }
}]
Run Code Online (Sandbox Code Playgroud)

我想要这样的结果

[{
    name: "Orange",
    first: 20
},{
    name: "Orange",
    middle: 53
},{
    name: "Orange",
    last: 52
},{
    name: "Apple",
    first: 42
},{
    name: "Apple",
    middle: 37
},{
    name: "Apple",
    last: 16
}]
Run Code Online (Sandbox Code Playgroud)

我试图找到解决方案,但发现很少有与此问题类似的问题,但没有运气

提前致谢

use*_*814 6

您可以在3.4.4版本中尝试以下聚合管道。

的改变quarters嵌入的文档转换成密钥值对阵列使用$objectToArray 随后$unwind$zipquarters键值对分别随后$arrayToObject创建原始结构。

使用$addFields该推name场进quarters

用于$replaceRootquarters嵌入的文档提升到顶级。

db.collection.aggregate([
{$addFields: {quarters: {$objectToArray: "$quarters"}}}, 
{$unwind:"$quarters"},
{$addFields:{quarters: {"$arrayToObject":{$zip:{inputs:[["$quarters.k"], ["$quarters.v"]]}}}}},
{$addFields:{"quarters.name": "$name"}},
{$replaceRoot:{newRoot:"$quarters"}}
])
Run Code Online (Sandbox Code Playgroud)