MongoDB geoNear,其随机坐标在范围内

时间:2019-04-16 15:28:54

标签: node.js mongodb nosql geojson aggregation

是否存在查询或汇总,使我能够生成特定数量的文档,其中包含在特定范围内的随机生成的位置(不一定存在于数据库中),并且该文档的位置离该生成的位置最近。

例如,生成10坐标,其经度在-71.2-71.3之间,纬度在46.7和{{1}之间},并对每个随机生成的坐标进行以下汇总:

46.9


换句话说,我想根据以下规则生成一定数量的坐标:

  • 随机生成的经度必须在预定范围内(例如db.collection.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ randomLng, randomLat ] }, distanceField: 'distance', spherical: true, limit: 1 } } ])
  • 随机生成的纬度必须在预定范围内(例如-73.2 < lng < -71.1

对于每个生成的坐标,从集合中检索最近的现有文档。简而言之,对于每个生成的坐标,请执行上述汇总。

我尝试从Web服务器生成10个坐标,并同时查询每个坐标中最近的文档,但是这需要很长时间。

我知道这似乎毫无用处,但是我是一名学生,这是我必须做的练习的一部分。


更新:

我设法通过以下方法查询特定范围内的随机坐标:

45.7 < lat < 46.4

但是,当我尝试添加以下/** * Generates random coordinates within a specified zone. * * @param {object} opts * @param {number} opts.lng - Longitude * @param {number} opts.lat - Latitude * @param {number} opts.offsetLng - Longitude's offset * @param {number} opts.offsetLat - Latitude's offset * @param {number} opts.qty - Number of documents to generate * @returns {Promise<any[]>} */ async function myQuery({ lng, lat, offsetLng, offsetLat, qty }) { // Generates a random number between 0 and 1 const rdmExpr = { $abs: { $divide: [ 1, { $reduce: { input: { $map: { input: { $range: [ 0, { $strLenCP: { $toString: '$_id' } } ] }, in: { $substrCP: [ { $toString: '$_id' }, '$$this', 1 ] } } }, initialValue: 0, in: { $add: [ { $convert: { input: '$$this', to: 'double', onError: -(Math.PI - 1) } }, '$$value' ] } } } ] } } return await db.collection('coord').aggregate([ { $sample: { size: qty } }, { // Generates random coordinates within range $replaceRoot: { newRoot: { coords: [ { $let: { vars: { rdm: rdmExpr }, in: { $add: [ lng, { $multiply: [ '$$rdm', offsetLng ] } ] } } }, { $let: { vars: { rdm: rdmExpr }, in: { $add: [ lat, { $multiply: [ '$$rdm', offsetLat ] } ] } } } ] } } } ]).toArray(); } 管道以从每个生成的坐标中检索最近的文档时,总是收到一条错误消息,指出“ 'near'字段必须为点»”。

$lookup

我在做什么错?还有其他方法吗?

注意: { $lookup: { from: 'coord', let: { c: "$coords" }, as: 'nearest', pipeline: [ { $geoNear: { near: { type: 'Point', coordinates: "$$c" }, distanceField: 'distance', spherical: true, limit: 1 } } ] } } 集合具有一个coord字段,上面带有2dsphere索引

0 个答案:

没有答案