2016-09-07 212 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"}))