将坐标数据转换为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使用mongo
setUnion
更改了数组的顺序,我更新了新代码。检查一下可能会对您有所帮助。我必须使用聚合框架来实现这一点,因为将有数百万的数据,我需要避免来自中间件的文档循环。