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