我有一个包含3个字段的CSV:名称,纬度,经度。一排看起来像这样:
Place 1,73.992964,40.739037
将纬度和经度mongoimport到loc字段的正确方法是什么?我知道位置索引字段需要是经度,纬度并且是单个数组而不是纬度和经度的2个离散字段但是如果有办法通过mongoimport处理从谨慎的值到数组
我是否需要首先转换为具有经度和纬度的单个列位的CSV?
Place1,[-73.992964,40.739037]
我经常会处理存储在独立列中的经度和经度的CSV,所以我希望找到一种方法来使用mongoimport。
答案 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的回答所示。