我有3个收藏品:
每个供应商都有多个地点(最多10,000个)和多个产品(最多10,000个)。
我需要在指定位置附近找到所有产品,然后按距离对它们进行排序。
到目前为止我所得到的是:
1)查找指定位置附近的所有供应商:
db.collection('vendor.locations').aggregate([
{
$geoNear: {
near: givenLocation,
distanceField: 'distance',
maxDistance: 1000,
limit: 1000,
spherical: true
}
},
{
$group: {
_id: "$vendor",
distance: {$min: "$distance"}
}
},
{
$sort: {distance: -1}
}
]);
2)使用$ in运算符查找匹配供应商的所有产品,但AFAIK不保证匹配项目的顺序。
db.collection('products').aggregate([
{
$match: {
vendor: {$in: vendorIds}
}
},
{
$sort: {} //is it possible to sort items by their position in vendorIds array?
},
{
$limit: limit
},
{
$skip: skip
}
)
因此,基本上问题归结为找到一种对产品进行分类的方法。
另一个可能的解决方案是将供应商位置非规范化为产品位置,但收集的潜在规模(和地理索引)令我担忧。产品集合最多可达1M,最多可嵌入10K嵌入式阵列,因此可以在地理索引中生成10B项目。有多糟糕?