2017-04-04 62 views
0

我在MongoDB中新蜂,我有收藏中包含键值对.. input collectionMongoDB的枢轴上键值

{"restaurantid" : NumberInt("1"), 
"Properties" : [ 
    { "Key" : "A", "Value" : NumberInt("25") }, 
    { "Key" : "B", "Value" : "StringValue" }, 
    { "Key" : "C", "Value" : ISODate("2017-02-09") } 
] } 

我期待的结果集作为 Output Collection

{ "restaurantid" : NumberInt("1"), 
    "A" : NumberInt("25"), 
    "B" : "StringValue", 
    "C" : ISODate("2017-02-09") 
} 

如何在聚合管道中不硬编码“A”,“B”,“C”来获取它。我的键值对将变得更大并且对于给定的ID是可变的

回答

1

如何在聚合管道中不硬编码“A”,“B”,“C”的情况下获取它。我的键值对会得到更大的,是给定id

变量您可以利用新的集成算$arrayToObjectSERVER-18794)转动的MongoDB键。该运营商目前可在MongoDB中v3.4.4 +

例如,你可以调整你的架构:

{ 
    "restaurantid" : NumberInt("1"), 
    "Properties" : [ 
    { "k" : "A", "v" : NumberInt("25") }, 
    { "k" : "B", "v" : "StringValue" }, 
    { "k" : "C", "v" : ISODate("2017-02-09") } 
    ] 
} 

然后,你可以利用下面的例子aggregation pipeline

db.collection.aggregate(
[ 
    {$project:{"tmp":{$arrayToObject:"$Properties"}, "restaurantid":"$resturantid"}}, 
    {$addFields:{"tmp.restaurantid":"$restaurantid"}}, 
    {$replaceRoot:{newRoot:"$tmp"}} 
]); 

参见$replaceRoot$addFields。根据您的使用情况,您也可以利用MongoDB灵活模式并重新考虑您的文档模型。