考虑 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/