mongodb - 如何将 MongoDB 集合转换为以元素值为键的对象?

标签 mongodb mapreduce aggregation-framework

考虑 MongoDB 的 zip codes aggregation示例 data set .集合中的每个文档如下所示:

{
  "_id": "10280",
  "city": "NEW YORK",
  "state": "NY",
  "pop": 5574,
  "loc": [
    -74.016323,
    40.710537
  ]
}

如何将集合转换为一个对象,其中每个键是字段的值,每个值是集合中的对象?

例如,给定两个文档

{ "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" }
{ "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" }

如何将它们转换成一个文档

{
  "01001": { "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" },
  "01002": { "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" }
}

?

我正在尝试 MongoDB shell 命令 db.zips.aggregate({$project: { "$_id":"$$CURRENT"}}).pretty(),我是收到错误消息 $expressions is not allowed at the top-level of $project

我还尝试将 mapReduce 与命令一起使用 db.zips.mapReduce(function(){emit(this._id, this)},function(k,v){}, {out:"stuffs"} ) 但毫不奇怪,它只会生成(使用 db.stuffs.find())

{ "_id" : "01001", "value" : { "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" } }
{ "_id" : "01002", "value" : { "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51565, 42.377017 ], "pop" : 36963, "state" : "MA" } }

最佳答案

可以使用游标方法 forEach() 迭代 find() 游标并访问您可以添加到对象变量的文档,如以下两个文档的示例所示:

var obj = {};
var iterator = function(doc){
    obj[doc._id] = doc;
}
db.collection.find({}).forEach(iterator);
printjson(obj);

输出

{
    "01001" : {
        "_id" : "01001",
        "city" : "AGAWAM",
        "loc" : [
            -72.622739,
            42.070206
        ],
        "pop" : 15338,
        "state" : "MA"
    },
    "01002" : {
        "_id" : "01002",
        "city" : "CUSHMAN",
        "loc" : [
            -72.51565,
            42.377017
        ],
        "pop" : 36963,
        "state" : "MA"
    }
}

关于mongodb - 如何将 MongoDB 集合转换为以元素值为键的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31523451/

相关文章:

c++ - 如何在 nodejs 服务器上使用 hadoop map/reduce?

hadoop - 如何将多个作业提交到 hadoop 集群

MongoDB 删除或限制字段条件聚合

mongodb - 根据字段的存在或不存在在投影管道中实现 mongo $cond 字段

mongodb - 使用官方 C# 驱动程序存储小文件时 MongoDb gridfs 中的 block 开销

java - 在文档 MongoDB 中添加或更改节点

node.js - 为什么在我的 .find() 输出中添加了 "Document"这个词?

MongoDB 错误 : couldn't connect to server . .. 在 createPrivateMap 中打开/创建失败

java - 在 MapReduce 程序中,reducer 没有被 Driver 调用

mongodb - Mongo $group 太慢了