将坐标数据转换为mongoDB中的旧坐标对

时间:2015-04-20 10:13:02

标签: mongodb geolocation location

我有一个以下列格式存储位置数据的集合:

{ "Place": "xyz", "Location": { "long": 42.34, "lat": 73.59 } }

我需要使用聚合查询将上述位置数据转换为传统坐标对。这就是我需要的输出:

 {   "Place": "xyz",   "Location": [42.34, 73.59] }

我将如何实现这一目标?坐标对的顺序非常严格,即经度首先应该是纬度。

2 个答案:

答案 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);
  })