我正在使用mongodb构建nodejs api作为Android应用程序的数据库。 当Android用户将其GPS位置发送到后端时,api会根据用户的距离对所有数据进行排序并回复。
为此,我在聚合框架中使用$ geoNear阶段。我按照说明操作,但我无法获取数据,只能“未定义”。
这是来自db。
的JSON数据格式{
userId: "",
description: "",
location: {
type: "Point",
coordinates: [ latitude, longitude ]
},
image: ""
}
这是我的geoNear代码。
db.posts.createIndex({location:"2dsphere"});
db.posts.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ parseFloat(geoInfo.latitude) , parseFloat(geoInfo.longitude) ] },
distanceField: "distance",
spherical: true
}
},
{ $sort: { distance: 1 } },
{ $limit: 20 }
], function(err, docs) {
if (err) {
callback(err, null);
}
callback(null, docs);
});
我只能看到未定义的结果。 现在我被困在这个问题上几天了。 任何帮助都非常感谢!
答案 0 :(得分:2)
这是工作代码。
db.open(function(err, db) {
var collection = db.collection("posts");
console.log(collection.listIndexes);
// Wait for a second before finishing up, to ensure we have written the item to disk
setTimeout(function() {
collection.aggregate([ {
$geoNear : {
near : {
type : "Point",
coordinates : [ parseFloat(-73.97), parseFloat(40.77) ]
},
distanceField : "distance",
spherical : true
}
}, {
$sort : {
distance : 1
}
}, {
$limit : 20
} ], function(err, docs) {
if (err) {
console.log(err);
}
console.log("completed...........");
console.log("doc ====>" + JSON.stringify(docs));
});
}, 1000);
});
插入和创建索引命令: -
db.posts.insert(
{
userId : "user1",
description : "desc 1",
loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks",
image : "image 1"
}
)
db.posts.insert(
{
userId : "user2",
description : "desc 2",
loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
name: "La Guardia Airport",
category : "Airport",
image : "image 2"
}
)
db.posts.createIndex( { loc : "2dsphere" } )