格式化MongoDB结果
当我们从集合“Articles”获取数据时,MongoDB返回以下JSON数组 但是,我需要以下格式的json格式化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":
[{
"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; };
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),可能在将来的版本中,请参阅