格式化MongoDB结果

格式化MongoDB结果,mongodb,mongodb-query,nosql,Mongodb,Mongodb Query,Nosql,当我们从集合“Articles”获取数据时,MongoDB返回以下JSON数组 但是,我需要以下格式的json [{ "id1": { "_id": "id1", "description": "Description for article", "author": "publisher of article" }, "id2": { "_id": "id2", "description":

当我们从集合“Articles”获取数据时,MongoDB返回以下JSON数组

但是,我需要以下格式的json

[{
    "id1": {
        "_id": "id1",
        "description": "Description for article",
        "author": "publisher of article"
    },
    "id2": {
        "_id": "id2",
        "description": "Description for article",
        "author": "publisher of article"
    },
    "id3": {
        "_id": "id3",
        "description": "Description for article",
        "author": "publisher of article"
    }
}]
使用MongoDB查询是否可以获得这样的结果?

您可以通过以下方法实现:

  • 地图功能:

    var mapFunction = function() {
        var obj = {};
    
        obj[this._id] = {
    
            "_id": this._id,
            "description": this.description,
            "author": this.author
    
        };
        emit(1,obj);
    };
    
    var reduceFunction = function(key, values) {
    
        var reduced = {};
    
        var output_arr = [];
    
        values.forEach(function(value) {
            Object.keys(value).forEach(function(key) {
                var obj = {};
                obj[key]=value[key];
                output_arr.push(obj);
            });
        });
    
        reduced["data"] = output_arr;
    
        return reduced;
    
    };
    
  • 减少功能:

    var mapFunction = function() {
        var obj = {};
    
        obj[this._id] = {
    
            "_id": this._id,
            "description": this.description,
            "author": this.author
    
        };
        emit(1,obj);
    };
    
    var reduceFunction = function(key, values) {
    
        var reduced = {};
    
        var output_arr = [];
    
        values.forEach(function(value) {
            Object.keys(value).forEach(function(key) {
                var obj = {};
                obj[key]=value[key];
                output_arr.push(obj);
            });
        });
    
        reduced["data"] = output_arr;
    
        return reduced;
    
    };
    
map reduce查询:

db.items.mapReduce(mapFunction, reduceFunction, { out: { inline: 1 } })
您可以在
结果[0].value.data
中访问结果。输出为:

{
    "results" : [
        {
            "_id" : 1,
            "value" : {
                "data" : [
                    {
                        "id1" : {
                            "_id" : "id1",
                            "description" : "Description for article",
                            "author" : "publisher of article"
                        }
                    },
                    {
                        "id2" : {
                            "_id" : "id2",
                            "description" : "Description for article",
                            "author" : "publisher of article"
                        }
                    },
                    {
                        "id3" : {
                            "_id" : "id3",
                            "description" : "Description for article",
                            "author" : "publisher of article"
                        }
                    }
                ]
            }
        }
    ],
    "timeMillis" : 11,
    "counts" : {
        "input" : 3,
        "emit" : 3,
        "reduce" : 1,
        "output" : 1
    },
    "ok" : 1
}

为什么要这样格式化?为了通过指定键直接获取结果,而不是在JSONC中循环,可以使用聚合或项目来完成此操作,因为当我运行此查询以获取大量记录时,需要花费大量时间。现在还没有(mongo 3.4),可能在将来的版本中,请参阅