我正在使用node-geoip模块,并执行聚合查询。我要查询的架构如下:
我遇到的第一个问题是似乎必须将geoNear放在管道的第一阶段:
另一个错误信息是
var mongoose = require('mongoose');
require('./location.js');
module.exports = mongoose.model('Region',{
attr1: Number,
attr2: String,
attr3: String,
locations:[mongoose.model('Location').schema]
});
并且
var mongoose = require('mongoose');
module.exports = mongoose.model('Location',{
attr1: Number,
latlong: { type: [Number], index: '2d' },
});
我需要在聚合查询中执行$geoNear操作,但我遇到了一些问题。首先,这是我的聚合方法:
var region = require('../models/region');
var geo = geoip.lookup(req.ip);
region.aggregate([
{$unwind: "$locations"},
{$project: {
attr1 : 1,
attr2 : 1,
locations : 1,
lower : {"$cond" : [{$lt: [ '$locations.attr1', '$attr1']}, 1, 0]}
}},
{
$geoNear: {
near: { type:"Point", '$locations.latlong': geo.ll },
maxDistance: 40000,
distanceField: "dist.calculated"
}
},
{ $sort: { 'locations.attr1': -1 } },
{$match : {lower : 1}},
{ $limit: 1 }
], function(err,f){...});
我遇到的第一个问题是似乎必须将geoNear放在管道的第一阶段:
exception: $geoNear is only allowed as the first pipeline stage
. 那么我的问题是,我是否可以在不展开子文档的情况下执行geoNear搜索?如果可以,如何实现?另一个错误信息是
errmsg: \"exception: 'near' field must be point\"
。这是什么意思,对我的代码有什么影响?我已经尝试使用near
作为:near: { type:"Point", '$locations.latlong': geo.ll },
$geoNear
在数组上应该可以正常工作 - 排序应该是每个文档中最接近的点。第二个错误表示您没有使用正确的语法$geoNear
。请查看$geoNear
,特别是底部的示例。 - wdberkeley$geoNear
移动到展开$locations
之前的第一阶段? - jordan