2016-09-07 215 views
0

我正在寫一個應用程序使用節點和mongodb,我無法進行任何地理位置查詢。我郵寄此查詢:

{ 
    "geometry": { 
      "type": "Point", 
      "coordinates" : [-8.139530, -79.032231 ] 
    } 
} 

,這是從我的服務器輸出:

{ MongoError: Unable to execute query: error processing query: ns=dblocations.locations limit=1000 skip=0          
Tree: GEONEAR field=geometry maxdist=0.00125569 isNearSphere=0                    
Sort: {}                                  
Proj: {}                                  
planner returned error: unable to find index for $geoNear query                    
    at Function.MongoError.create (/Users/giuseppemarotta/Documents/Mockinghi/node_modules/mongodb-core/lib/error.js:31:11)     
    at queryCallback (/Users/giuseppemarotta/Documents/Mockinghi/node_modules/mongodb-core/lib/cursor.js:198:34)        
    at /Users/giuseppemarotta/Documents/Mockinghi/node_modules/mongodb-core/lib/connection/pool.js:436:18          
    at _combinedTickCallback (internal/process/next_tick.js:67:7)                    
    at process._tickCallback (internal/process/next_tick.js:98:9)                    
    name: 'MongoError',                               
    message: 'Unable to execute query: error processing query: ns=dblocations.locations limit=1000 skip=0\nTree: GEONEAR field=geometry maxdist 
=0.00125569 isNearSphere=0\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query',        
    '$err': 'Unable to execute query: error processing query: ns=dblocations.locations limit=1000 skip=0\nTree: GEONEAR field=geometry maxdist= 
0.00125569 isNearSphere=0\nSort: {}\nProj: {}\n planner returned error: unable to find index for $geoNear query',        
    code: 17007 } 

我曾嘗試使用本地mongoshell /貓鼬查詢,我不能讓它工作。

這是我的位置模式:

var mongoose  = require('mongoose'); 
var Schema  = mongoose.Schema; 


var LocationSchema = new mongoose.Schema({ 

    name: String, 
    geometry: { 
     coordinates: { type: [Number], required:true } 
    }, 
    created_by : { type: String, required: true}, 
    category: String, 
    description: String, 
    rating: Number, 
    created_at: Date, 
    updated_at: Date 
}); 

// on every save, add the date 
LocationSchema.pre('save', function(next) { 
    // get the current date 
    var currentDate = new Date(); 
    rating = 0 ; 
    // change the updated_at field to current date 
    this.updated_at = currentDate; 

    // if created_at doesn't exist, add to that field 
    if (!this.created_at) 
    this.created_at = currentDate; 

    next(); 
}); 

LocationSchema.index({ geometry: '2dsphere' }); 

module.exports=mongoose.model('Location', LocationSchema); 

這是我的server.js:

 //lets require/import the mongodb native drivers. 
var mongoose = require('mongoose'); 
//We need to work with "MongoClient" interface in order to connect to a mongodb server. 


// Connection URL. This is where your mongodb server is running. 
var url = 'mongodb://--------:[email protected]:21895/dblocations'; 
var Location = require('./models/location'); 
var User = require('./models/user'); 

//lets require/import the mongodb native drivers. 
var mongodb = require('mongodb'); 

//We need to work with "MongoClient" interface in order to connect to a mongodb server. 
var MongoClient = mongodb.MongoClient; 

mongoose.connect(url); 

// server.js 

// BASE SETUP 
// ============================================================================= 

// call the packages we need 
var express = require('express');  // call express 
var app  = express();     // define our app using express 
var bodyParser = require('body-parser'); 


router.route('/query') 
// create a location (accessed at POST http://localhost:8080/mockinghi/register) 
    .post(function(req, res) { 

    var limit = req.query.limit || 10; 
    limit=10; 
    // get the max distance or set it to 8 kilometers 
    var maxDistance = req.query.distance || 8; 
    var minDistance = 0; 
    // we need to convert the distance to radians 
    // the raduis of Earth is approximately 6371 kilometers 
    maxDistance /= 6371; 

    // get coordinates [ <longitude> , <latitude> ] 
    var coords = []; 
    console.log(req); 
    coords = req.body.geometry.coordinates; 

    console.log("coords = "+coords);  
    console.log("MAxDistance = "+maxDistance); 
/* 
    // Use connect method to connect to the Server 
    MongoClient.connect(url, function (err, db) { 
    if (err) { 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
    } else { 
     //HURRAY!! We are connected. :) 
     console.log('Connection established to', url); 
     var locations_col = db.collection('locations'); 
     // do some work here with the database. 

     locations_col.createIndex({ "geometry": "2d" }); 

     locations_col.createIndex({ "geometry.coordinates": "2d" }); 
     locations_col.ensureIndex({ "geometry" : "2dsphere" }); 
     locations_col.ensureIndex({ "geometry.coordinates" : "2dsphere" }); 


     locations_col.find(
      { 
       geometry: {   
       $near : 
        { 
         $geometry: { type: "Point", 
            coordinates:[ coords[0], 
               coords[1] ] }, 
         $maxDistance: maxDistance 
        }, 
       } 
      } 
     ).toArray(function (err, result) { 
       if (err) { 
        console.log(err); 
       } else if (result.length) { 
        console.log('Found:', result); 
       } else { 
        console.log('No document(s) found with defined "find" criteria!'); 
       } 
      } 
     ); 



     //Close connection 
     db.close(); 

    } 
    }); 


*/ 

    // find a location 
    Location.find({ 
     loc: {   
     $near : 
       { 
       $geometry: { type: "2d", 
          coordinates:[ coords[0], 
              coords[1] ] }, 
       $maxDistance: maxDistance 
       }, 
     } 
    }).limit(limit).exec(function(err, locations) { 
     if (err) { 
     return res.json(500, err); 
     } 
    //console.log(locations); 
    res.json(200, locations); 
    }); 


    }); 
+1

這可以幫助http://stackoverflow.com/questions/23188875/mongodb-unable-to-find-index-for-geonear-query – abdulbarik

+0

@abdulbarik已經嘗試過。 – Giuseppe

回答

0

改變你的模型:

var mongoose  = require('mongoose'); 
var Schema  = mongoose.Schema; 


var LocationSchema = new mongoose.Schema({ 

    name: String, 
    geometry: { 
     coordinates: { type: [Number], required:true } 
    }, 
    created_by : { type: String, required: true}, 
    category: String, 
    description: String, 
    rating: Number, 
    created_at: Date, 
    updated_at: Date 
}); 

// on every save, add the date 
LocationSchema.pre('save', function(next) { 
    // get the current date 
    var currentDate = new Date(); 
    rating = 0 ; 
    // change the updated_at field to current date 
    this.updated_at = currentDate; 

    // if created_at doesn't exist, add to that field 
    if (!this.created_at) 
    this.created_at = currentDate; 

    next(); 
}); 

LocationSchema.index({ geometry: '2dsphere' }); 

module.exports=mongoose.model('Location', LocationSchema); 
+0

相同:「$ err」:「無法執行查詢:錯誤處理查詢:ns = dblocations.locations limit = 10 skip = 0 \ nTree:GEONEAR field = loc maxdist = 0.00125569 isNearSphere = 0 \ nSort:{} \ nProj: {} \ n planner返回錯誤:無法找到$ geoNear查詢的索引「, – Giuseppe

+0

嘗試類似於: 」geometry「:{ 」$ near「:{ 」$ geometry「:{」type「:」Point「 ,「coordinates」:[parseFloat(MyLongitude),parseFloat(MyLatitude)]}, 「$ maxDistance」:parseFloat(MyRadius) } – HoefMeistert

0

它需要一個GeoJSON的對象類型是一個字符串,但默認它是一個點。還有其他一些東西,如多邊形,線條等,但你只是存儲點。記住座標爲[經度,緯度]

geometry: { 
    type: { 
     type: String, 
     default: "Point" 
    }, 
    coordinates: { 
     type: [Number] 
    }, 
    index: '2dsphere' 
} 

你也可以把指數別的地方

LocationSchema.index({geometry: '2dsphere'}); 
0

您需要爲您的項目等,作爲錯誤明確規定建立索引就沒有指數$geoNear

db.collection_name.createIndex({"geometry.coordinates": "2dsphere"}))