如何在mongodb&&amp ;;中首先返回具有特定值的结果PHP

时间:2014-08-15 08:21:19

标签: php mongodb mongodb-query aggregation-framework

我有mongodb数据库并使用php。我正在从数据库中搜索酒店。我想搜索“芝加哥”城市。对于芝加哥,其目的地代码为“ CHI ”。

我得到了结果,但问题是我在结果中也使用相同的目的地代码获得其他城市。他们是

  • 芝加哥
  • 霍夫曼庄园
  • Evanston的
  • 阿狄森。

现在我想以这样的方式解雇或订购,如果我搜索芝加哥,所有芝加哥酒店必须先来到其他地方。

我不能使用“sort {'city':1}”,因为如果用户搜索“Evanston”城市而不是这个城市的结果将不会出现在顶部。

我该怎么办?预先感谢。

2 个答案:

答案 0 :(得分:3)

一种方法,而不是“动态排名”最高效的方法是在识别出城市代码后,在第二个查询中使用聚合框架。这个城市代码可以作为“自动完成”的一部分来完成,这使得城市选择上的事情变得美观和干净。

在这里,您基本上将查询过的“城市”排名为最高。但当然“城市”也需要成为你收藏中的一个领域:

db.collection.aggregate([
    // Match all documents by "cityCode"
    { "$match": { "cityCode": "CHI" } },

    // Score the documents with matching city
    { "$project": {
        "city": 1,
        "score": { "$cond": [ { "$eq": [ "$city", "Evenston" ] }, 1, 0 ]}
    }},

    // Sort by score descending, so highest first
    { "$sort": { "score": -1 } }
])

沿着这些方向的方法是合理的,但它确实需要聚合框架来处理文档,然后对它们进行排序以便放置最高的结果。

对我而言,如果我是“酒店匹配”,那么在我的“城市”系列中,我将“cityCode”与“city”的关系按名称和我的“酒店”系列保存,我会存储geoLocation对于“城市”和实际“酒店”位置一般的坐标。通过这种方式,我可以得到与响应匹配的坐标,并且基本上发出查询以找到哪个是“最近的”:

db.collection.find({
    "cityCode": "CHI",
    "location": {
        "$nearSphere": {
            "$geometry": {
                "type": "Point",
                "coordinates": [ 87.6947, 42.0464 ]
            }
        }
    }
})

因此,您将从“引用”集合中“提取”“Evanston”的坐标数据,并使用该数据与“酒店”实际所在的“位置”字段进行比较。这种“最近”的方法自然按距离给定的协调进行排序,因此所有结果都是“最接近”到“最远”的顺序。

如果您在整体“排名”中需要更多灵活性,则可以使用$geoNear表单作为汇总管道,这样您就可以返回更多结果,或者使用排序顺序和其他计算字段:< / p>

db.collection.aggregate([
    { "$geoNear": {
        "near": { "type": "Point", "coordinates": [ 87.6947, 42.0464 ] },
        "distanceField": "distance",
        "query": { "cityCode": "CHI" },
        "num": 200,
        "spherical": true
    }}

    // Other pipeline stages
    { ... }
])

除了其他自定义之外,这会“指定”文档中指定的“distanceField”,以便您以后可以使用该值。

但你基本上需要另一种排名形式。您可以像第一个示例中那样手动分配,但对我来说,自然拟合似乎是添加地理空间数据和索引。

答案 1 :(得分:0)

从MongoDB 2.6开始,这在find()查询中是不可能的。您要求使用相同的排序键

进行相同的查询
> db.hotels.find(query, project).sort(sort_key)

并通过为不同的值分配优先级等内容以不同的顺序返回结果(搜索Evanston,Evanston是最高优先级)。执行此操作的最佳方法是使用客户端语言中的sort_by()函数。

相关问题