我有一个CSV,包含3个字段:名称、纬度、经度。一排看起来像这样:
Place 1,73.992964,40.739037
将纬度和经度输入位置字段的正确方法是什么?我知道位置索引字段需要是经度、纬度,并且是一个单独的数组,而不是纬度和经度的2个离散字段,但我不知道是否有一种方法可以通过mongoimport 处理从离散值到数组的转换
我是否需要首先转换为一个CSV,其中包含一个包含经度和纬度的单列loc?
Place1,[-73.992964,40.739037]
我经常会处理那些将纬度和经度存储在独立列中的CSV,所以我希望找到一种使用mongoimport实现这一点的方法。
Mongoimport的功能非常有限,在这种情况下,官方建议编写一个自定义脚本,逐行解析csv文件,并按照您希望的方式创建文档。
为了创建地理空间索引,位置信息必须存储在同一个关键字下,如地理空间索引文档顶部的"一些示例:"部分所述:http://www.mongodb.org/display/DOCS/Geospatial+索引
直接从.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文件直接导入到您的集合中。
我遇到了类似的问题,我通过使用sed
执行短的预处理过程将CSV转换为合适的JSON格式(也使用新的GeoJSON对象)来解决它:
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非常高效,即使csv文件包含大约800万行,执行转换也只需要大约一分钟。
然后,使用mongoimport
导入新创建的JSON文件是一项简单的任务,如Marc的回答所示。