MongoDb以键值为轴心

MongoDb以键值为轴心,mongodb,pivot,aggregation-framework,Mongodb,Pivot,Aggregation Framework,我是MongoDB的新蜜蜂,我有一个包含键值对的集合,如下所示。。 我期待的结果集 如果不在聚合管道中硬编码“A”、“B”、“C”,如何获得它。我的键值对将变得更大,并且对于给定的id是可变的 如果不在聚合管道中硬编码“A”、“B”、“C”,如何获得它。我的键值对将变得更大,并且对于给定的id是可变的 您可以使用新的聚合运算符$arrayToObject()来透视MongoDB键。该操作符目前在MongoDB v3.4.4中可用+ 例如,您可以重新构造架构: { "restauranti

我是MongoDB的新蜜蜂,我有一个包含键值对的集合,如下所示。。

我期待的结果集

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

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

您可以使用新的聚合运算符
$arrayToObject
()来透视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") }
  ]
}
然后,您可以使用以下示例:

另见和。根据您的用例,您还可以利用MongoDB灵活模式并重新考虑您的文档模型

{ "restaurantid" : NumberInt("1"), 
  "A" : NumberInt("25"), 
  "B" : "StringValue", 
  "C" : ISODate("2017-02-09") 
}
{
  "restaurantid" : NumberInt("1"),
  "Properties" : [
    { "k" : "A", "v" : NumberInt("25") },
    { "k" : "B", "v" : "StringValue" },
    { "k" : "C", "v" : ISODate("2017-02-09") }
  ]
}
db.collection.aggregate(
[
    {$project:{"tmp":{$arrayToObject:"$Properties"}, "restaurantid":"$resturantid"}}, 
    {$addFields:{"tmp.restaurantid":"$restaurantid"}}, 
    {$replaceRoot:{newRoot:"$tmp"}}
]);