我有mongodb数据库并使用php。我正在从数据库中搜索酒店。我想搜索“芝加哥”城市。对于芝加哥,其目的地代码为“ CHI ”。
我得到了结果,但问题是我在结果中也使用相同的目的地代码获得其他城市。他们是
现在我想以这样的方式解雇或订购,如果我搜索芝加哥,所有芝加哥酒店必须先来到其他地方。
我不能使用“sort {'city':1}”,因为如果用户搜索“Evanston”城市而不是这个城市的结果将不会出现在顶部。
我该怎么办?预先感谢。
答案 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()
函数。