mongoDB GeoJSON,查询近两点或行

时间:2016-02-18 15:59:43

标签: mongodb geojson

我有一个这样的集合:

origin: {
    location : {
        type: String,
        coordinates: [lgnt,lat]
    }
},
destination: {
    location : {
        type: String,
        coordinates: [lgnt,lat]
    }
}

使用索引:' 2dsphere'在location.origin和location.destination。

然后我从另一个人那里得到了另一个'点和'到'点,我试图在DB中获取所有文档:

  • 来源于'来自'点
  • 目的地是arond' to'点。

对于一个或另一个,没关系:

db.find({
   'origin.location': {
       $nearSphere: {
           $geometry: {
               type: "Point",
               coordinates: [from.lng, from.lat]
           },
           $maxDistance: 10
       }
   }
})

然而,在文档中,它是写的,我不能使用两个$ near查询。我尝试了一些类似的东西:

db.find({
  'origin.location': {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [from.lng, from.lat]
      },
      $maxDistance: 10
    }
  },
  'destination.location': {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [to.lng, to.lat]
      },
      $maxDistance: 10
    }
  }
});

由于使用两个$ near / $ nearSphere而无法正常工作。 所以我尝试了

$and : [
    $near: ...,
    $near: ...
]

它也不起作用。 我尝试使用汇总但您无法在$near中使用$match。 你会怎么做 ?

  • 也许我在这里错过了一些东西?
  • 我可以使用LineString并尝试查询类似的' LineString,但该怎么做?
  • 当前的解决方案是执行2个查询,一个用于原点,一个用于目标,然后在客户端中与两个选项卡相交,以便我得到我的结果,但它有2个查询。
P.S:我也尝试过:

var origines = db.find({
  'origin.location': {
    $nearSphere: {
      $geometry: {
        type: "Point",
        coordinates: [from.lng, from.lat]
      },
      $maxDistance: 10
    }
  }
}, {
  _id: 1
})
origines = origines.map(function(elem) {
  return elem._id;
});
db.find({
  $and: [{
    _id: {
      $in: origines
    }
  }, {
    'destination.location': {
      $nearSphere: {
        $geometry: {
          type: "Point",
          coordinates: [to.lng, to.lat]
        },
        $maxDistance: 10
      }
    }
  }]
});

但不,

1 个答案:

答案 0 :(得分:0)

从mongoDB 4.2开始,您可以计算到目标的距离,然后使用match。

db.getCollection('test').aggregate([
    {
        $geoNear: {
            near: {
                type: "Point",
                coordinates: [ from.lng, from.lat ]
            },
            distanceField: "distanceToOrigin",
            maxDistance: 10,
            spherical: true
        }
    },
    {
        $addFields: {
            "distanceToDestination" : {
                $multiply: [
                    6371000,
                    { $acos: { $add: [
                        { $multiply: [
                            { $sin: { $degreesToRadians: {"$arrayElemAt": ["$destination.location.coordinates", 1]} } },
                            { $sin: { $degreesToRadians: to.lat } }
                        ]},
                        { $multiply: [
                            { $cos: { $degreesToRadians: {"$arrayElemAt": ["$destination.location.coordinates", 1]} } },
                            { $cos: { $degreesToRadians: to.lat } },
                            { $cos: { $degreesToRadians: { "$subtract": [ { "$arrayElemAt": ["$destination.location.coordinates", 0] }, to.lng ] } } }
                        ]}
                    ] } }
                ]
            }
        }
    },
    {
        $match: { "distanceToDestination": {$lt: 10} }
    }
])