【问题标题】:Convert Mongodb schema including nested Object转换包含嵌套对象的 Mongodb 模式
【发布时间】:2018-08-03 08:18:46
【问题描述】:

假设一个像这样的 mongodb 集合模式:

{
   "_id"         : ObjectId("5a5b2657a19692e18a3792ad"),
   "Toponym"     : "Climate station Stavenhagen",
   "Lat"         : 53.33333,
   "Lon"         : "13.99999",
   "SensorMaker" : "Hitachi",
   "SensorClass" : "Thermometer",
   "Dimension"   : "SoilTemperature_0.05mSensor1",
   "Gauge"       : "degC"
}

我想将整个集合(约 90k 项)更改为此,以符合最小 GeoJson:

{
  "_id"         : ObjectId("5a5b2657a19692e18a3792ad"),
  "Toponym"    : "Climate station Stavenhagen",
  "geometry"   : {
       "type"        : "Point", 
       "coordinates" : [53.33333, 13.99999]
       },
  "SensorMaker": "Hitachi",
  "SensorClass": "Thermometer",
  "Dimension"  : "SoilTemperature_0.05mSensor1",
  "Gauge"      : "degC"
}

我尝试使用此查询对其进行转换,但无论我做什么都会收到类似“第 5 行:意外字符串”之类的错误:

db.sensor_geo.aggregate([
{ '$group' : {
    '_id' : '$_id',
    'Toponym' : '$Toponym'
    'geometry': { 'type': 'Point', { $set : {"coordinates.$[]": [ {'$Lat', '$Lon'} ] }}},
    'SensorMaker' : '$SensorMaker',
    'SensorClass' : '$SensorClass',
    'Dimension'   : '$Dimension',
    'Gauge'       : '$Gauge'
   } 
}
]);

我是否应该使用$push 而不是$set,即使这也无济于事?我是否还必须为嵌套对象创建一个 ObjectID,这可能导致了问题?

【问题讨论】:

    标签: mongodb-query geojson


    【解决方案1】:

    您可以尝试使用以下聚合管道进行批量写入。

    以下聚合将 Lat 和 Lon 字段更改为几何,并通过批量更新写入新几何字段并删除 Lat 和 Lon 字段。

    var bulk = db.getCollection("sensor_geo").initializeUnorderedBulkOp();
    var count = 0;
    var batch = 1;
    
    db.getCollection("sensor_geo").aggregate([
    {"$project":{
        "geometry":{
          "type":"Point", "coordinates":["$Lat", "$Lon"]
        }
    }}]).forEach(function(doc){ 
        var _id = doc._id; 
        var geometry = doc.geometry; 
        bulk.find({ "_id" : _id }).updateOne(
          {
            $set: {"geometry":geometry},
            $unset: {"Lat":"", "Lon":""}
          }
       ); 
        count++;  
        if (count == batch) { 
            bulk.execute(); 
            bulk = db.getCollection("sensor_geo").initializeUnorderedBulkOp(); 
            count = 0;
        } 
    });
    
    if (count > 0) { 
        bulk.execute(); 
    }
    

    【讨论】:

    • 谢谢。我收到错误消息:“FieldPath 'Point' 不是以 $ 开头”。我尝试使用以下方法解决问题: {"$project":{ "geometry": { $literal: { "type": "Point" }}, "coordinates":["$Lat", "$Lon"] }但仍然失败,新的“对象表达式中不允许的字段类型数组(在'坐标')”。为什么不允许字段类型数组?令人困惑。
    • Yw。您是否在 mongo shell 中运行查询?你的 mongo 服务器版本是什么?您不需要使用文字和数组应该可以工作。
    • MongoDB shell 版本:Ubuntu 16.04 上的 2.6.10,但从 Robo3T a.k.a Robomongo 执行脚本
    • 哦,好吧,这就解释了。那是已于 2016 年 10 月报废的旧服务器。如果不是最新的 3.6,您至少可以升级到 3.2 吗? 3.2 中添加了数组和常量支持
    • 你帮了我。做到了。在经历了一段冒险之后,你的脚本终于解决了这个问题。无论它做什么,我都会调查 unorderedbuld 的东西。太好了。
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2021-10-01
    • 2021-07-07
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多