【问题标题】:How do I transform a MongoDB collection to an object keyed on an element's value?如何将 MongoDB 集合转换为以元素值为键的对象?
【发布时间】:2015-07-21 02:21:01
【问题描述】:

考虑 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 are not allowed at the top-level of $project

我也尝试使用带有命令 db.zips.mapReduce(function(){emit(this._id, this)},function(k,v){}, {out:"stuffs"}) 的 mapReduce,但毫不奇怪,它只会产生(使用 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" } }

【问题讨论】:

    标签: mongodb mapreduce aggregation-framework


    【解决方案1】:

    您可以使用游标方法 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"
        }
    }
    

    【讨论】:

    • 谢谢,@chridam。我正在寻找一种仅查询的方式来执行此操作,而无需游标。我应该更具体地回答我的问题。
    • @MatthewAdams,请使用$unwind
    猜你喜欢
    • 2020-08-31
    • 2015-09-24
    • 1970-01-01
    • 2021-07-07
    • 2022-01-13
    • 2019-08-17
    • 1970-01-01
    • 2015-11-07
    • 2019-03-15
    相关资源
    最近更新 更多