将坐标数据转换为mongoDB中的传统坐标对
我有一个以以下格式存储位置数据的集合:将坐标数据转换为mongoDB中的传统坐标对,mongodb,geolocation,location,Mongodb,Geolocation,Location,我有一个以以下格式存储位置数据的集合: { "Place": "xyz", "Location": { "long": 42.34, "lat": 73.59 } } 我需要使用聚合查询将上述位置数据转换为遗留坐标对。这就是我需要的输出: { "Place": "xyz", "Location": [42.34, 73.59] } 我怎样才能做到这一点?坐标对的顺序非常严格,即经度应排在第一位,然后是纬度。使用mongo查询,如下所示 db.collectionName.aggre
{ "Place": "xyz", "Location": { "long": 42.34, "lat": 73.59 } }
我需要使用聚合查询将上述位置数据转换为遗留坐标对。这就是我需要的输出:
{ "Place": "xyz", "Location": [42.34, 73.59] }
我怎样才能做到这一点?坐标对的顺序非常严格,即经度应排在第一位,然后是纬度。使用mongo查询,如下所示
db.collectionName.aggregate({
"$group": {
"_id": "$Place",
"Long": {
"$push": "$Location.long"
},
"Lat": {
"$push": "$Location.lat"
}
}
}, {
"$project": {
"Places": "$_id",
"_id": 0,
"Location": {
"$setUnion": ["$Lat", "$Long"]
}
}
}).pretty()
$setUnion对数组执行集合操作,将数组视为集合。如果数组包含重复项,$setUnion将忽略重复项$setUnion忽略元素的顺序
从上面的链接中,它提到setUnion
忽略顺序。因此,它显示了一些错误的结果。为了找到这个,我尝试了许多mongo查询,但没有成功。然后使用mongo方法显示预期输出
db.collectionName.find({
"Location": {
"$exists": true
}
}).forEach(function(data) {
locationData = [];
locationData.push(data.Location.long);
locationData.push(data.Location.lat);
var document = {
Place: data.Place,
Location: locationData
};
printjson(document);
})
现在,使用mongoDB 3.2的特性就可以做到这一点。因此,聚合将如下所示:
db.locations.aggregate({
"$group": {
"_id": "$Place",
"Long": {
"$push": "$Location.long"
},
"Lat": {
"$push": "$Location.lat"
}
}
}, {
"$project": {
"Places": "$_id",
"_id": 0,
"Location": {
"$concatArrays": ["$Long", "$Lat"]
}
}
})
使用$concatArrays也可以保留顺序如何确保结果中的位置顺序?位置数组包含第一个是
lat
,第二个是long
,使用此“$setUnion”:[“$lat”,“$long”]
在projectI中,我得到的lat不是第一个,而是第一个。我使用的是mongoDB 2.6版。1@cj0809使用mongosetUnion
更改了数组的顺序,我更新了新代码。检查一下可能会对您有所帮助。我必须使用聚合框架来实现这一点,因为将有数百万的数据,我需要避免来自中间件的文档循环。