MongoDB: 将字段类型从字符串转换为数组
MongoDB: Converting field type from String to Array
我使用 mongoimport 导入了一个 csv 文件。这个数据集要具体:
我遇到的问题是 description
字段。
[{"landing_point_id":3522,"latlon":"51.898325,-8.472768","name":"Cork, Ireland"}]
我认为这是一个对象数组,所以我正在为它制作一个猫鼬模型,如下所示:
description: [{
landing_point_id: Number,
latlon: String,
name: String
}],
但这给了我一个空数组。如果我将 description
的类型设置为 String
我确实得到了值——当然是作为一个字符串,所以这些属性是不可访问的。
"description" : "[{\"landing_point_id\":8398,\"latlon\":\"52.207114,1.620294\",\"name\":\"Sizewell, United Kingdom\"}]"
所以问题似乎是字段 description
是 String
而我希望它是 Array
.
根据此处的回答,我尝试将其从字符串转换为数组,但没有成功。
db.cables.find().snapshot().forEach(function (el) {
el.description_array = [ el.description ];
db.cables.save(el);
});
这只是将字符串包装在另一个数组中。
"description_array" : [ "[{\"landing_point_id\":8398,│ col10: '',
\"latlon\":\"52.207114,1.620294\",\"name\":\"Sizewell, United Kingdom\"}]" ]
也一样
el.description_array = new Array(el.description);
有什么解决办法吗?
可以在导入之前在 csv 文件中进行编辑以使 mongoimport 正确解释它吗?
"string" 现在需要 "parsed" 成为一个有效的数据结构。此外,"latlong" 对您来说无用,因为 "string" 本身和 MongoDB 期望坐标的顺序错误。
所以我们同时修复:
var bulk = db.cables.initializeOrderedBulkOp(),
count = 0;
db.cables.find({ "description": { "$type": 2 } }).forEach(function(doc) {
doc.description = JSON.parse(doc.description);
doc.description = doc.description.map(function(desc) {
desc.coordinates = desc.latlon.split(",").reverse().map(function(el) {
return parseFloat(el);
});
delete desc.latlong;
return desc;
});
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "description": doc.description }
});
count++;
// Send batch one in 1000
if (count % 1000 == 0) {
bulk.execute();
bulk = db.cables.initializeOrderedBulkOp();
}
});
// Clear any queued
if ( count % 1000 != 0 )
bulk.execute();
将您的 mongoose 架构更改为:
"description": [{
"landing_point_id": Number,
"coordinates": [],
"name": String
}],
现在您拥有了可以编制索引并用于 GeoSpatial 查询的数据。
我使用 mongoimport 导入了一个 csv 文件。这个数据集要具体:
我遇到的问题是 description
字段。
[{"landing_point_id":3522,"latlon":"51.898325,-8.472768","name":"Cork, Ireland"}]
我认为这是一个对象数组,所以我正在为它制作一个猫鼬模型,如下所示:
description: [{
landing_point_id: Number,
latlon: String,
name: String
}],
但这给了我一个空数组。如果我将 description
的类型设置为 String
我确实得到了值——当然是作为一个字符串,所以这些属性是不可访问的。
"description" : "[{\"landing_point_id\":8398,\"latlon\":\"52.207114,1.620294\",\"name\":\"Sizewell, United Kingdom\"}]"
所以问题似乎是字段 description
是 String
而我希望它是 Array
.
根据此处的回答,我尝试将其从字符串转换为数组,但没有成功。
db.cables.find().snapshot().forEach(function (el) {
el.description_array = [ el.description ];
db.cables.save(el);
});
这只是将字符串包装在另一个数组中。
"description_array" : [ "[{\"landing_point_id\":8398,│ col10: '',
\"latlon\":\"52.207114,1.620294\",\"name\":\"Sizewell, United Kingdom\"}]" ]
也一样
el.description_array = new Array(el.description);
有什么解决办法吗?
可以在导入之前在 csv 文件中进行编辑以使 mongoimport 正确解释它吗?
"string" 现在需要 "parsed" 成为一个有效的数据结构。此外,"latlong" 对您来说无用,因为 "string" 本身和 MongoDB 期望坐标的顺序错误。
所以我们同时修复:
var bulk = db.cables.initializeOrderedBulkOp(),
count = 0;
db.cables.find({ "description": { "$type": 2 } }).forEach(function(doc) {
doc.description = JSON.parse(doc.description);
doc.description = doc.description.map(function(desc) {
desc.coordinates = desc.latlon.split(",").reverse().map(function(el) {
return parseFloat(el);
});
delete desc.latlong;
return desc;
});
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "description": doc.description }
});
count++;
// Send batch one in 1000
if (count % 1000 == 0) {
bulk.execute();
bulk = db.cables.initializeOrderedBulkOp();
}
});
// Clear any queued
if ( count % 1000 != 0 )
bulk.execute();
将您的 mongoose 架构更改为:
"description": [{
"landing_point_id": Number,
"coordinates": [],
"name": String
}],
现在您拥有了可以编制索引并用于 GeoSpatial 查询的数据。