2016-06-01 2 views
0

Я строю nodejs api, используя mongodb как базу данных для Android-приложения. Когда пользователь Android отправляет свое GPS-положение на задний план, api сортирует все данные на расстоянии от пользователя и отвечает обратно.

Для этого я использую $ geoNear stage в структуре агрегации. Я следовал инструкциям, но я не могу получить данные, только «undefined».

Здесь приведен формат данных JSON от db.

{ 
    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); 
}); 

Я вижу только неопределенный результат. Теперь я застрял в этом выпуске в течение нескольких дней. Любая помощь очень ценится!

ответ

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" }) 
+0

Привет Notionquest, спасибо за любезный ответ. Ваш код, похоже, работает с образцами данных, но когда я привожу его в свою базу данных, он также не работает. –

+0

Произошла ошибка. '' errmsg ":" исключение: команда geoNear не выполнена: {errmsg: \ "exception: поле 'near' должно быть точкой \", код: 17304, ok: 0.0} ",' –

+0

Пожалуйста, укажите точную копию вашего документ (1 или 2 документа). В противном случае было бы сложно отладить вашу проблему. – notionquest

Смежные вопросы