Mongoimport位置来自CSV中的独立纬度和经度列

时间:2012-03-30 01:31:47

标签: mongodb geospatial mongoimport

我有一个包含3个字段的CSV:名称,纬度,经度。一排看起来像这样:

Place 1,73.992964,40.739037

将纬度和经度mongoimport到loc字段的正确方法是什么?我知道位置索引字段需要是经度,纬度并且是单个数组而不是纬度和经度的2个离散字段但是如果有办法通过mongoimport处理从谨慎的值到数组

我是否需要首先转换为具有经度和纬度的单个列位的CSV?

Place1,[-73.992964,40.739037]

我经常会处理存储在独立列中的经度和经度的CSV,所以我希望找到一种方法来使用mongoimport。

2 个答案:

答案 0 :(得分:2)

Mongoimport功能非常有限,在这种情况下,官方建议编写一个自定义脚本,逐行解析csv文件,并按照您希望它们表示的方式创建文档。

为了创建地理空间索引,位置信息必须存储在相同的密钥下,如地理空间索引文档顶部的“一些示例:”部分所述:http://www.mongodb.org/display/DOCS/Geospatial+Indexing

直接从.csv文件导入数据会创建如下文档:

doc1.csv:
place, lat, lon
Place 1,73.992964,40.739037

$ ./mongoimport -d test -c a --type csv --headerline --file doc1.csv 

> db.a.find()
{ "_id" : ObjectId("4f7602d70c873ff911798fd3"), "place" : "Place 1", "lat" : 73.992964, "lon" : 40.739037 }

不幸的是,无法在上面的文档中创建地理空间索引。

通过实验,我尝试使用您描述的第二种格式导入.csv文件,但没有成功。

doc2.csv:
place, loc
Place1,[-73.992964,40.739037]

$ ./mongoimport -d test -c b --type csv --headerline --file doc2.csv 

> db.b.find()
{ "_id" : ObjectId("4f7602e40c873ff911798fd4"), "place" : "Place1", "loc" : "[-73.992964", "field2" : "40.739037]" }

作为进一步的实验,我将.csv文档更改为json格式,然后导入它,它似乎有效。

doc3.json:
{name:"Place1" , loc:[-73.992964,40.739037]}

$ ./mongoimport -d test -c c --type json --file doc3.json 

> db.c.find()
{ "_id" : ObjectId("4f7604570c873ff911798fd5"), "name" : "Place1", "loc" : [ -73.992964, 40.739037 ] }

但是,如果您正在编写一个脚本以将所有.csv文件转换为.json格式,那么最好编写自定义脚本以将.csv文件直接导入到集合中。

答案 1 :(得分:1)

我遇到了类似的问题,我通过使用sed执行简短的预处理过程来解决它,将CSV转换为合适的JSON格式(也使用新的GeoJSON objects):

sed 's/\([^,]*\),\([0-9.-]*\),\([0-9.-]*\)/{ place: \1, location:{ type: "Point", coordinates: [ \3, \2 ] } }/' <data.csv >data.json

对正在发生的事情的解释:

sed          // Execute the sed command
's/          // Use substitute mode

\([^,]*\)    // Match a string containing anything except a ',' [1]
,            // Match a single ',' (the separator)
\([0-9.-]*\) // Match any combination of numbers, '.' or '-' [2]
,            // Match a single ',' (the separator)
\([0-9.-]*\) // Match any combination of numbers, '.' or '-' [3]

/{ place: \1, location:{ type: "Point", coordinates: [ \3, \2 ] } }/'
// Replace the match with the appropriate JSON format, inserting
// parts of the matched pattern ([1],[2],[3])

<data.csv    // Perform the command on the contents of the data.csv file
>data.json   // Output the results to a data.json file

我发现sed效率非常高,即使使用包含约800万行的csv文件,也只需要大约一分钟的时间来执行此转换。

使用mongoimport导入新创建的JSON文件是一项简单的任务,如Marc的回答所示。