- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个使用 node.js mongodb 和 mongoose 实现的地理数据 API。我想用两个条件查询我的数据。
首先,我使用 geoNear 获取给定半径内的所有位置,效果很好。其次,我想按类型进一步过滤位置。
这是我的模式:
var GeoLocationSchema = new Schema({
name: String,
type: String,
loc: {
type: {
type: String,
required: true,
enum: ["Point", "LineString", "Polygon"],
default: "Point"
},
coordinates: [Number]
}
});
// ensure the geo location uses 2dsphere
GeoLocationSchema.index({ loc : "2dsphere" });
这是我的 geoNear 查询:
router.route("/locations/near/:lng/:lat/:type/:max")
// get locations near the get params
.get(function(req, res) {
// setup geoJson for query
var geoJson = {};
geoJson.type = "Point";
geoJson.coordinates = [parseFloat(req.params.lng), parseFloat(req.params.lat)];
// setup options for query
var options = {};
options.spherical = true;
options.maxDistance = parseInt(req.params.max)/6370000;
// query db with mongoose geoNear wrapper
GeoLocation.geoNear(geoJson, options, function (err, results, stats) {
if (err)
res.send(err);
res.json(results);
});
});
是否可以以某种方式将 geoNear 查询与特定类型位置的查询相结合,或者我可以以某种方式过滤结果?
提前致谢。
最佳答案
只要您的 MongoDB 服务器足够新,是 2.6 或更高版本,那么此功能实际上已移至通用查询引擎。此处的 mongoose 方法包装了 .runCommand()
形式,该形式被认为在所有 future 版本中都已弃用,因此只需放置一个带有附加运算符的标准查询即可。
GeoLocation.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"$maxDistance": distanceInMeters
},
"loc.type": "Point"
},function(err,docs) {
// The documents are also mongoose document objects as well
});
在 $nearSphere
上查看更多选项或其他运营商的选择。这里的主要区别是 $maxDistance
在使用 GeoJSON 形式时以米为单位,而不是在其他情况下以弧度为单位。
当然还有$geoNear
聚合管道的运算符。这从 MongoDB 2.4 开始可用,并且可以采用其他选项(例如“查询”)来进一步缩小结果范围。这里的另一个可能的优势是它将一个字段“转换”到您的结果中,表示与查询点的“距离”。这可以用于其他计算或自定义排序:
GeoLocation.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"distanceField": "distance",
"maxDistance": distanceInMeters,
"spherical": true,
"query": { "loc.type": "Point" }
}},
{ "$sort": { "distance": -1 } } // Sort nearest first
],
function(err,docs) {
// These are not mongoose documents, but you can always cast them
}
);
需要注意的其他差异是,在标准查询表单中,结果不再像“命令”表单中那样限制为 100 个文档。默认情况下,聚合 $geoNear
限制为 100 个文档作为结果,但返回的文档数量可以通过管道命令的附加“限制”选项进行调整。聚合语句不会对结果进行“排序”,除了从搜索返回的最大文档数之外,这些结果是给定条件的顶部结果,但它们未按顺序返回,因此您需要按所示方式对它们进行排序。
在任何一种情况下,您都应该移动您的代码以使用这些形式中的任何一种,因为命令形式被认为已弃用并将在未来被删除。 Mongoose API 是否保留它的方法作为其中一种形式的“包装器”是未知的,但几乎不可能,因此最好坚持使用受支持的形式。
关于node.js - 将 geoNear 查询与另一个值查询结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25584279/
我有一个看起来像这样的集合: { "_id" : ObjectId("5783051796a90cd8098fc3e0"), "name" : "Org 1", "locati
我有一个看起来像这样的集合: { "_id" : ObjectId("5783051796a90cd8098fc3e0"), "name" : "Org 1", "locati
我在 Java 中使用 mongodb 的地理功能,我在运行命令“geoNear”时遇到以下问题: 给定: 名为“GEOENTITIES”的集合,包含 GeoJSON 对象 此集合使用 Java 代码
我有一个名为 test 的集合,我想使用 geoNear 进行查询。 2d 索引设置在字段 loc 上。 我在这里正确使用 db.runCommand 吗? db.open (err, client)
我正在使用 MongoDB 2.6.3 查询大量地理空间数据。具体来说,我正在查询中心位置几公里范围内所有 ping 的数据集,然后按用户标识符折叠它们以计算每个用户有多少 ping。 当然,我为此使
我想根据它们与 2D 空间中多个点的接近程度对我的结果进行排序。 我假设这将通过查询第一点然后根据第二点重新查询/检查这些结果来完成? 也许下面的代码可以更好地解释我想要实现的目标? db.runCo
我有以下数据: { "_id" : ObjectId("55a8c1ba3996c909184d7a22"), "uid" : "1db82e8a-2038-4818-b805-76a
在mongodb中使用geoNear时是否可以添加更多的过滤器?例如,假设我的记录如下所示: { _id: {}, cid: 1, latlon: [ -74.07096147537231, 4
我在记录集合 Mongodb (3.4) 中有文档,如下所示:- { "_id" : ObjectId("592d0c78555a7436b0883960"), "us
我有这个查询: db.places.aggregate([ { "$geoNear" : { "near" : { "type" : "Po
我正在使用 mongoDB 在 Java 应用程序中存储和获取位置相关信息。 我在使用“geoNear”获取数据时遇到异常... 这是存储数据的代码: Document doc = new Docum
我正在 MongoDB 中对我的用户模型执行查询,并希望首先按搜索结果的距离(以公里为单位)(使用 $geoNear 运算符),然后按上次登录时间对搜索结果进行排序。问题是,距离属性以浮点变量中的米形
我的收藏有如下字段,存储用户签到(地理坐标) { "_id" : ObjectId("5333c3063b15ea390b3c986a"), "userID" : "5332cad33
我正在使用 NodeJs 和 Mongoose 并构建一个功能来列出附近的交易。 Deal.db.db.command({ "geoNear": Deal.collection.name
我一直在网上搜索与此相关的内容,但找不到。 我有这个聚合 Place.aggregate( [ { "$geoNear": { "near": {
我在集合 offers 中有以下示例 mongodb 文档。 集合:优惠 { "countryCode" : "LU", "geoLocation" : [ {
我有一个简单的 MongoDo 聚合查询: { "$geoNear": { "near": { "type": "Point",
我在 MongoDB 中有一些地理空间数据,我想找到靠近用户位置并符合特定条件的地点列表。 这是我的文档结构: { "_id" : { "$oid" : "528af043d1a2760efcd2fd
我的文档结构如下: { agency_key : '', route_id: '', direction_id: '', stops: [ {stop_id:15,
我正在开发一个 PHP 应用程序,我们需要在其中检索特定边界内的结果,但按结果的创建日期而不是距离排序。我认为 MongoDB 的 geoNear 命令对此非常有用,因为它负责计算每个结果的距离。但是
我是一名优秀的程序员,十分优秀!