Mongoose基于纬度和经度信息与文本索引对文档进行排序

时间:2016-09-30 08:56:30

标签: node.js mongodb aggregation-framework mongoose-schema

我正在研究搜索功能,用户可以搜索某个餐馆。场景是:

我正在收集餐馆,其中我有多个位置及其纬度和经度信息。 现在在搜索期间,

我有用户的位置信息(纬度和经度)。因此,我必须根据最近到最远的用户位置对餐厅进行排序,并且必须对使用文本索引编制索引的字段的内容进行文本搜索。

我有不同的搜索方案,所以我使用聚合管道和投影来评分结果。 有人可以建议我从哪里开始吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试以下步骤:

<强>步骤1:

在架构中添加位置字段,并在其上创建2dsphere索引。

location: { type: [Number], index: '2dsphere' }

您还可以动态创建索引:

db.collection.createIndex( { <location field> : "2dsphere" } )

<强>第二步

现在使用$ geoNear:

创建聚合查询
var aggregateQuery = [{
        "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [options.longitude, options.latitude]
            },
            "distanceField": 'dis',
            "distanceMultiplier": .001,
            "spherical": true,
            "query": **conditions**
        }
    }];

您可以在查询参数中传递任何条件。

db.collectionname.aggregate(aggregateQuery).exec(function(err, result){
// use result here
})

注意:请记住先将经度存储在位置数组中,然后再存储纬度。

有关详细信息,请参阅此链接: https://docs.mongodb.com/manual/reference/command/geoNear/

希望这会有所帮助!!

<强>更新

db.collectionname.aggregate([
  {$match: {
      $text: {$search: "text"} ,
      location: {$geoWithin: {$centerSphere: [[ longitude, latitude], points]}}
  }}])

注意:不会使用地理索引!

有关详细信息,请参阅此链接http://docs.mongodb.org/manual/reference/operator/query/geoWithin/