将行透视到MongoDB中的列

将行透视到MongoDB中的列,mongodb,pivot,Mongodb,Pivot,有关的问题是。但答案是特定于SQL的 我希望得到相同的结果,即在MongoDB中不聚合任何内容(目前为止)而将行透视到列 该集合的外观如下所示。以下是facebook页面属性的统计信息: timestamp | propName | propValue -------------------------------- 1371798000000 | page_fans | 100 -------------------------------- 1371798000000 | page_post

有关的问题是。但答案是特定于SQL的

我希望得到相同的结果,即在MongoDB中不聚合任何内容(目前为止)而将行透视到列

该集合的外观如下所示。以下是facebook页面属性的统计信息:

timestamp | propName | propValue -------------------------------- 1371798000000 | page_fans | 100 -------------------------------- 1371798000000 | page_posts | 50 -------------------------------- 1371798000000 | page_stories | 25 -------------------------------- 预期输出JSON:

{
        "timestamp" : NumberLong("1371798000000"),
        "provider" : "Facebook",
        "page_storytellers" : NumberLong(30871),
        "page_fans" : NumberLong("1371798000000"),
        "page_fan_adds" : NumberLong("1371798000000")
}

我使用聚合做过类似的事情。这有帮助吗

db.foo.insert({ timestamp: '1371798000000', propName: 'page_fans', propValue: 100})
db.foo.insert({ timestamp: '1371798000000', propName: 'page_posts', propValue: 25})
db.foo.insert({ timestamp: '1371798000000', propName: 'page_stories', propValue: 50})

db.foo.aggregate({ $group: { _id: '$timestamp', result: { $push: { 'propName': '$propName', 'propValue': '$propValue' } }}})

{
    "result" : [
        {
            "_id" : "1371798000000",
            "result" : [
                {
                    "propName" : "page_fans",
                    "propValue" : 100
                },
                {
                    "propName" : "page_posts",
                    "propValue" : 50
                },
                {
                    "propName" : "page_stories",
                    "propValue" : 25
                }
            ]
        }
    ],
    "ok" : 1
}

您可能希望在此过程中使用
$sum
运算符。请参见

现在,您可以利用新的聚合来透视MongoDB键。该操作符在MongoDB v3.4.4中提供+

例如,给出以下数据示例:

db.foo.insert({ provider: "Facebook", timestamp: '1371798000000', name: 'page_storytellers', value: 20871})
db.foo.insert({ provider: "Facebook", timestamp: '1371798000000', name: 'page_fans', value: 1291509})
db.foo.insert({ provider: "Facebook", timestamp: '1371798000000', name: 'page_fan_adds', value: 2829})
db.foo.insert({ provider: "Google", timestamp: '1371798000000', name: 'page_fan_adds', value: 1000})
您可以使用以下工具:

产出将是:

{
  "page_fan_adds": 1000,
  "provider": "Google",
  "timestamp": "1371798000000"
},
{
  "page_fan_adds": 2829,
  "page_fans": 1291509,
  "page_storytellers": 20871,
  "provider": "Facebook",
  "timestamp": "1371798000000"
}
另见, , , ,
首先,mongoDb有json格式的文档。发布您拥有的json和您想要返回的json,以便我们更好地理解它。第二,你为什么要这样做?在客户端做这件事肯定更好,我不会用下面的答案来做这件事,很快你就会发现这样的查询存在缩放问题。对于动态文件名,检查看起来很有趣。这是我的想法之一,但问题是我需要根据特定属性及其值生成每日图表。获得这样的结果仍然需要在代码中进行一些额外的处理,这是我想要避免的。我看看能不能把这个放在什么地方。谢谢你的回复,欢迎光临。如果你认为这不能完全回答你的问题,请考虑至少投票。祝你好运。对不起,我现在就这么做了。我想我可以通过在服务器端服务中获取输出和格式,并将结果以可用于绘制图表的格式返回给客户端来利用上面的内容。如果有更好的选择,我们将等待。再次感谢!!!想一想,如果需要生成每日图表,使用
map\u reduce
可能是个好主意。这是一个更好的答案。
db.foo.insert({ provider: "Facebook", timestamp: '1371798000000', name: 'page_storytellers', value: 20871})
db.foo.insert({ provider: "Facebook", timestamp: '1371798000000', name: 'page_fans', value: 1291509})
db.foo.insert({ provider: "Facebook", timestamp: '1371798000000', name: 'page_fan_adds', value: 2829})
db.foo.insert({ provider: "Google", timestamp: '1371798000000', name: 'page_fan_adds', value: 1000})
db.foo.aggregate([
  {$group:
     {_id:{provider:"$provider", timestamp:"$timestamp"}, 
      items:{$addToSet:{name:"$name",value:"$value"}}}
  }, 
  {$project:
     {tmp:{$arrayToObject: 
       {$zip:{inputs:["$items.name", "$items.value"]}}}}
  }, 
  {$addFields:
     {"tmp.provider":"$_id.provider", 
      "tmp.timestamp":"$_id.timestamp"}
  }, 
  {$replaceRoot:{newRoot:"$tmp"}
  }
]);
{
  "page_fan_adds": 1000,
  "provider": "Google",
  "timestamp": "1371798000000"
},
{
  "page_fan_adds": 2829,
  "page_fans": 1291509,
  "page_storytellers": 20871,
  "provider": "Facebook",
  "timestamp": "1371798000000"
}