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 可以直接访问的单个文档。
因此,您可以:
- 使用
findOne()
代替find()
或
- 像
square.forEach(function(mydoc){<iterate through cursor here>})
一样使用游标方法
我已经复制了您的数据并使用 findOne()
测试了您的查询,结果运行良好。
我正在试验 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 可以直接访问的单个文档。
因此,您可以:
- 使用
findOne()
代替find()
或 - 像
square.forEach(function(mydoc){<iterate through cursor here>})
一样使用游标方法
我已经复制了您的数据并使用 findOne()
测试了您的查询,结果运行良好。