MongoDB - 几何对象到return线性环中的总数pairs/points

MongoDB - Geometry object to return the total pairs/points in linear ring

我正在尝试根据存储在集合中的文档中的 shapefile 数据编写性能报告。

这是一个数据样本:

以下函数工作得很好,因为它 returns 每个文档的字节数 - 很好,但是我也想知道每个多边形的线性字符串中存储了多少 points/pairs每个文档。

db.getCollection("_collectionName").aggregate([{"$project": {"object_size": { $bsonSize: "$$ROOT" }}}])

这returns以下一组数据(样本):

  { _id: ObjectId("5ef7da26ae8659149c97657e"), rootSize: 42215 },
  { _id: ObjectId("5ef7da45ae8659149c97657f"), rootSize: 118574 },
  { _id: ObjectId("5ef7daf1ae8659149c976585"), rootSize: 11886 },
  { _id: ObjectId("5f216685dbef0f7c3339ec03"), rootSize: 43136 },
  { _id: ObjectId("5ef7daa6ae8659149c976582"), rootSize: 40823 },
  { _id: ObjectId("5f3495129861ce45eb4e9728"), rootSize: 394884 },
  { _id: ObjectId("5ef7d7f6ae8659149c97657c"), rootSize: 125309 },
  { _id: ObjectId("5ef7dad6ae8659149c976584"), rootSize: 127447 },
  { _id: ObjectId("5fa56ef26538cd3bddd8389e"), rootSize: 17670 },
  { _id: ObjectId("5fa56ef26538cd3bddd8389f"), rootSize: 11398 },
  { _id: ObjectId("5fa56ef16538cd3bddd8389c"), rootSize: 2415 },
  { _id: ObjectId("5fa56ef36538cd3bddd838ae"), rootSize: 1757 },
  { _id: ObjectId("5fa56ef36538cd3bddd838b0"), rootSize: 4866 },
  { _id: ObjectId("5fa56ef36538cd3bddd838a8"), rootSize: 1510 },
  { _id: ObjectId("5fa56ef26538cd3bddd838a7"), rootSize: 39631 },
  { _id: ObjectId("5fa56ef36538cd3bddd838ab"), rootSize: 3662 },
  { _id: ObjectId("5fa56ef36538cd3bddd838aa"), rootSize: 15844 },
  { _id: ObjectId("5fa56ef16538cd3bddd8389d"), rootSize: 17196 },
  { _id: ObjectId("5fa56ef26538cd3bddd838a3"), rootSize: 34940 },
  { _id: ObjectId("5fa56ef36538cd3bddd838af"), rootSize: 468367 }

这很棒,但它没有告诉我 geometry.coordinates 中的 array/linear 字符串中有多少个元素。

我试过以下方法,但没有雪茄:

db.getCollection("_collectionName").aggregate([{$project: { count: { $size: { "$ifNull": [ "$geometry", [] ] } } } }])
MongoServerError: The argument to $size must be an array, but was of type: object

它返回一个错误,我理解 - 所以我引用了坐标数组:

db.getCollection("_collectionName").aggregate([{$project: { count: { $size: { "$ifNull": [ "$geometry.coordinates", [] ] } } } }])

其中,返回以下数据,再次正确,如果你理解 GeoJSON 文件,这是正常的,因为这是线性环的顶层,示例数据:

{ _id: ObjectId("5ef7da26ae8659149c97657e"), count: 1 }
{ _id: ObjectId("5ef7da45ae8659149c97657f"), count: 1 }
{ _id: ObjectId("5ef7daf1ae8659149c976585"), count: 1 }
{ _id: ObjectId("5f216685dbef0f7c3339ec03"), count: 1 }

然后我将 0 的顶级数组添加到我的聚合函数中:

db.getCollection("_collectionName").aggregate([{$project: { count: { $size: { "$ifNull": [ "$geometry.coordinates.0", [] ] } } } }])

这是返回的内容:

{ _id: ObjectId("5ef7da26ae8659149c97657e"), count: 0 }
{ _id: ObjectId("5ef7da45ae8659149c97657f"), count: 0 }
{ _id: ObjectId("5ef7daf1ae8659149c976585"), count: 0 }
{ _id: ObjectId("5f216685dbef0f7c3339ec03"), count: 0 }

这是不可能的,这是Studio3T软件的截图:

任何可能能够帮助我或指出正确方向的人都请这样做....

(非常感谢!)

点符号不适用于聚合中的数组元素。您需要使用 $arrayElemAt 运算符,如下所示:

db.getCollection("_aGStbl").aggregate([{
    $project: {
       count: { $size: { $arrayElemAt: [ "$geometry.coordinates", 0 ]}}
    }
}])

为了满足 Null 值,您可以使用 $cond,具体取决于您的 objective 输出:

将一些数据插入测试数据库:

db.arrayTest.insertMany([
{ _id: 1, arrayOfArrays: [ [ 1, 2, 3 ], [ 1, 2, 3, 4 ], [ 1, 2, 3, 4, 5, 6, 7 ] ] },
{ _id: 2, arrayOfArrays: [ [ 4, 5 ], [ 5, 6, 7 ] ] },
{ _id: 3, arrayOfArrays: [ [], [] ] },
{ _id: 4, arrayOfArrays: [ [], [], [] ] },
{ _id: 5 }
] )
{ acknowledged: true,
  insertedIds: { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 } }

试试这些聚合调用:

db.arrayTest.aggregate([{$project: { count: { $size: { "$ifNull": [ { $arrayElemAt: [ "$arrayOfArrays", 0 ] }, [ ] ] } } } } ] )
{ _id: 1, count: 3 }
{ _id: 2, count: 2 }
{ _id: 3, count: 0 }
{ _id: 4, count: 0 }
{ _id: 5, count: 0 }

db.arrayTest.aggregate([{$project: { count: { $cond: { if: {$arrayElemAt: [ "$arrayOfArrays", 0 ]}, then: { $size: { $arrayElemAt: [ "$arrayOfArrays", 0 ] } }, else: null} } } } ] )
{ _id: 1, count: 3 }
{ _id: 2, count: 2 }
{ _id: 3, count: 0 }
{ _id: 4, count: 0 }
{ _id: 5, count: null }