Mongodb $ geoNear运算符无法正常工作

时间:2016-06-01 20:26:15

标签: node.js mongodb

我正在使用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);
});

我只能看到未定义的结果。 现在我被困在这个问题上几天了。 任何帮助都非常感谢!

1 个答案:

答案 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" } )