MongoDB 和地理空间查询:未知地理说明符:$geometry:null

MongoDB and geospatial queries: unknown geo specifier: $geometry: null

我正在试验 mongodb 和地理空间查询。我制作了以下合集:

shape> db.shape.find()
[
  {
    _id: ObjectId("61ab50d2056b5357b5e23e56"),
    name: 'Point1',
    structure: { type: 'Point', coordinates: [ 2.5, 2.5 ] }
  },
  {
    _id: ObjectId("61ab5337056b5357b5e23e57"),
    name: 'Point2',
    structure: { type: 'Point', coordinates: [ 5, 5 ] }
  },
  {
    _id: ObjectId("61ab533e056b5357b5e23e58"),
    name: 'Point3',
    structure: { type: 'Point', coordinates: [ 9, 9 ] }
  },
  {
    _id: ObjectId("61ab5b4d056b5357b5e23e64"),
    name: 'square',
    structure: {
      type: 'Polygon',
      coordinates: [ [ [ 0, 0 ], [ 0, 5 ], [ 5, 5 ], [ 5, 0 ], [ 0, 0 ] ] ]
    }
  }
]

然后我尝试了以下方法:

var square = db.shape.find({name :"square"});
db.shape.find({structure : { $geoWithin : { $geometry : square.structure}}});

我收到这个错误:

MongoServerError: unknown geo specifier: $geometry: null

为什么 $geometry 为空?

提前致谢

在处理查询时,square.structure 被替换为 null,因为您试图以错误的方式访问该变量。

在那个 square 变量中,您正在存储 find() 方法返回的结果。

find() 方法 returns 游标,我们需要使用游标方法(如 forEach)来访问包含的文件。其中 findOne() returns 可以直接访问的单个文档。

因此,您可以:

  1. 使用findOne()代替find()
  2. square.forEach(function(mydoc){<iterate through cursor here>})
  3. 一样使用游标方法

我已经复制了您的数据并使用 findOne() 测试了您的查询,结果运行良好。