mongodb $ text附近

时间:2014-09-18 21:50:17

标签: node.js mongodb geospatial

好的,我的目标是对我的收藏品执行文本搜索,然后过滤这些结果,以确保它们属于我的“甜甜圈”几何体。 mongo site的例子:

enter image description here

这是艰难的部分。 Mongo的文档证实,今天你无法将$ text和$ near的精彩结合起来:

  

您不能将需要特殊地理空间索引的$ near运算符与使用不同类型的特殊索引的查询运算符或命令相结合。例如,您不能将$ near与$ text查询组合在一起。

Sooo ..这就是我今天所做的。请注意,我当前的方法没有实现“甜甜圈”几何体(它只是一个直径越来越大的圆圈,当用户在地图上“缩放”时会返回重复的结果。)

    var vendorResponse = JSON.parse(body);
    var vendorPosts = vendorResponse.postings;

    //Get the location of the user
    var userLat = req.query.lat;
    var userLong = req.query.long;

    //Get the item that furthest away from the user
    var furthestitem = sortedVendorPosts[sortedVendorPosts.length - 1];

    //Calculate the radius of the area
    var radius = Math.sqrt( Math.pow((userLat-furthestitem.location.lat), 2) + Math.pow((userLong-furthestitem.location.long), 2) )

    PostModel.find({
        $text: { $search: heading, $language: 'english' },
        $or: mongoCategories,
        coordinates :
             { $geoWithin :
                 {
                     $centerSphere : [ [ userLong, userLat ] , radius ]
                 }
             }
        } , { score: {
                $meta: "textScore"
            }
        }, function (err, results) {




        });

我试图使用mongos $ geoIntersects方法,但我正在敲打墙头来制定这个查询。如何解决mongos当前限制的详细示例将是一个神送!谢谢你们!

1 个答案:

答案 0 :(得分:1)

在我的案例场景中似乎有几个解决方案:

  1. 使用Mongo Connect并集成诸如solr或elasticsearch之类的内容
  2. 使用Mongo的$ in方法执行嵌套查询' ..这需要对db进行两次查询
  3. 使用Mongo的$ regex方法(正如其他人所描述的那样,我已在下面演示过)。

    PostModel.find({
        coordinates: { $near: {
            $geometry: { type: "Point", coordinates: [ userLong , userLat ] },
            $maxDistance: maxDistance,
            $minDistance: minDistance
            }
        },
        $or: mongoCategories,
        term: { "$regex": term, "$options": 'i' }
    }, function (err, results) {
        //systematic error. Redirect user so they can report error.
        if (err) {
            console.log(err);
            callback(body);
        // if no result found
        } else if (!results) {  
            callback(results);
        } else if (results) {
            callback(results);
        }
    });
    
  4. 我已经联系了Mongodb团队,看看我们何时可以跨多个索引执行搜索。希望这有用!