我有一个以下列格式存储位置数据的集合:
{ "Place": "xyz", "Location": { "long": 42.34, "lat": 73.59 } }
我需要使用聚合查询将上述位置数据转换为传统坐标对。这就是我需要的输出:
{ "Place": "xyz", "Location": [42.34, 73.59] }
我将如何实现这一目标?坐标对的顺序非常严格,即经度首先应该是纬度。
答案 0 :(得分:1)
现在可以使用$concatArray
功能使用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
也可以保留订单答案 1 :(得分:0)
使用mongo $setUnion查询,如下所示
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对数组执行set操作,将数组视为集合。如果数组包含重复的条目,$ setUnion将忽略重复的条目。 $ setUnion忽略元素的顺序。
从上面的链接中,它提到setUnion
忽略了订单。因此它显示了一些错误的结果。为了找到这个,我尝试了许多mongo查询,但没有成功。然后使用mongo forEach方法显示预期的输出
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);
})