Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mongodb&;中首先返回具有特定值的结果&;php_Php_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

如何在mongodb&;中首先返回具有特定值的结果&;php,php,mongodb,mongodb-query,aggregation-framework,Php,Mongodb,Mongodb Query,Aggregation Framework,我有mongodb数据库,并将其与php一起使用。我正在从数据库中搜索酒店。我想在芝加哥搜索。芝加哥的目的地代码是“CHI” 我得到了结果,但问题是我得到的结果中的其他城市也有相同的目的地代码。是的 芝加哥 霍夫曼庄园酒店 埃文斯顿 艾迪生 现在,我想通过这样的方式来炒作或订购,如果我搜索芝加哥,芝加哥所有的酒店都必须排在第一位 我不能使用“sort{'city':1}”,因为如果用户搜索“Evanston”城市,那么这个城市的结果将不会出现在顶部 我该怎么做???先谢谢你 从MongoDB

我有mongodb数据库,并将其与php一起使用。我正在从数据库中搜索酒店。我想在芝加哥搜索。芝加哥的目的地代码是“CHI

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

  • 芝加哥
  • 霍夫曼庄园酒店
  • 埃文斯顿
  • 艾迪生
现在,我想通过这样的方式来炒作或订购,如果我搜索芝加哥,芝加哥所有的酒店都必须排在第一位

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


我该怎么做???先谢谢你

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

> db.hotels.find(query, project).sort(sort_key)

并通过为不同的值分配类似优先级的内容,以不同的顺序返回结果(搜索Evanston,Evanston是最高优先级)。最好的方法是在您的客户机语言中使用
sort_by()
函数。

一种方法,而不是最有效的“动态排名”方法是在识别城市代码后,在第二次查询中使用聚合框架。该城市代码可以作为“自动完成”的一部分来完成,这也可以使城市选择变得整洁

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

db.collection.aggregate([
//按“城市代码”匹配所有文档
{“$match”:{“cityCode”:“CHI”},
//用匹配的城市为文档打分
{“$project”:{
"城市":一,,
“得分:{“$cond”:[{“$eq”:[“$city”,“Evenston”]},1,0]}
}},
//按分数降序排序,所以第一个最高
{“$sort”:{“score”:-1}
])
沿着这些思路的方法是合理的,但它确实需要聚合框架来处理文档,然后对它们进行排序,以便将结果放在最高的位置

但对我来说,如果我是“酒店匹配”,那么在我的“城市”集合中,我保留了“城市代码”与“城市”的名称关系,在我的“酒店”集合中,我将存储“城市”和实际“酒店”位置的地理位置坐标。通过这种方式,我可以获得与响应匹配的坐标,并基本上发出查询以查找哪个是“最近的”:

db.collection.find({
“城市代码”:“CHI”,
“地点”:{
“$nearSphere”:{
“$geometry”:{
“类型”:“点”,
“坐标”:[87.6947,42.0464]
}
}
}
})
因此,您可以从“cites”集合中“提取”埃文斯顿的坐标数据,并将其与“酒店”实际所在的“位置”字段进行比较。这种“最近的”方法自然地按距离给定坐标的距离排列,因此所有结果都按“最近的”到“最远的”顺序排列

如果您在整体“排名”中需要更大的灵活性,您可以使用聚合管道的表单,这允许您返回更多结果和/或使用排序顺序和其他计算字段:

db.collection.aggregate([
{“$geoNear”:{
“近”:{“类型”:“点”,“坐标”:[87.6947,42.0464]},
“距离字段”:“距离”,
“查询”:{“城市代码”:“CHI”},
“num”:200,
“球形”:正确
}}
//其他管道阶段
{ ... }
])
除了其他定制之外,此“项目”将指定的“距离字段”投影到文档中,以便您以后可以使用该值


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

这种逻辑很难在数据库查询中表达。您最好的选择是在应用程序中重新安排记录。这里有点不清楚您是如何根据查询临界值确定目标代码的。或者你是如何从“奇加戈”或者“埃文斯顿”中得到“气”的,如果你是这样问的。您当前的代码和方法将有助于理解如何解决此问题。首先,我启动查询以获取城市的“目的地代码”。例如,用“CHI”代替“Chicago”。然后,我启动了另一个查询,比如get all hotel with destination_code='CHI'。这是我得到的“埃文斯顿”。“埃文斯顿”的目的地代码相同。在这里,我想排序必须做得像第一个显示所有芝加哥酒店比埃文斯顿。。现在你得到了???这是一个有用的!!!我试图将其集成到我在php中使用的“mongodb_库”中。但这是不可能的,但在mongodb中非常有用。谢谢。@arpitdesai您可以在PHP中完成此操作。集合上存在聚合方法。如果您在转换语法时遇到问题,请查看json_decode。这实际上是我喜欢用PHP表示数据结构的方式,因为我讨厌
array()
语法。我认为这很不直观。