2013-07-11 8 views
6

नेवला संस्करण में भू-स्थानिक निर्देशांक के साथ: 3.6 नोड संस्करण: 0.10का उपयोग कर() नेवला (NodeJS + MongoDB)

मैं घंटों के लिए इस समस्या को हल करने के लिए कोशिश कर रहे हैं। मैं कुछ निर्देशांकों के लिए अधिकतम दस्तावेजों के मुकाबले सभी दस्तावेज ढूंढना चाहता हूं। मैं मोंगोडीबी (2dsphere) के जियोजसन विनिर्देशों का उपयोग करने की कोशिश कर रहा हूं, ताकि मैं मीटर में दूरी इनपुट कर सकूं।

यह मेरा स्कीमा "venue.js" है:

var db = require('mongoose'), 
    Schema = db.Schema, 
    ObjectId = Schema.ObjectId; 

var venueSchema = new Schema({ 
    geo: { type: [Number], index: '2dsphere'}, 
    city: String, 
    name: String, 
    address: String 
}); 


module.exports = db.model('Venue', venueSchema); 

यह वह जगह है जहाँ मैं क्वेरी ctrlVenue.js सम्मिलित करें:

var Venue = require('../models/venue.js'); 


VenueController = function(){}; 

/** GET venues list ordered by the distance from a "geo" parameter. Endpoint: /venues 
    Params: 
     - geo: center for the list of venues - longitude, latitude (default: 25.466667,65.016667 - Oulu); 
     - maxDistance: maxímum distance from the center for the list of venues (default: 0.09) 
**/ 
exports.getVenues =function(req, res) { 

    var maxDistance = typeof req.params.maxDistance !== 'undefined' ? req.params.maxDistance : 0.09; //TODO: validate 
    var geo = typeof req.params.geo !== 'undefined' ? req.params.geo.split(',') : new Array(25.466667, 65.016667); //TODO: validate 

    var lonLat = { $geometry : { type : "Point" , coordinates : geo } }; 


    Venue.find({ geo: { 
     $near: lonLat, 
     $maxDistance: maxDistance 
    }}).exec(function(err,venues){ 
     if (err) 
      res.send(500, 'Error #101: '+err); 
     else 
      res.send(venues); 
     }); 
    } 

मैं त्रुटि प्राप्त जब मैं कोड चलाएँ:

"Error #101: CastError: Cast to number failed for value \"[object Object]\" at path \"geo\""

मैं बजाय इस लाइन को संशोधित करते हैं:

$near: lonLat, 

$near: geo, 

मैं सही ढंग से दस्तावेज प्राप्त है, लेकिन फिर, मैं माप की इकाई के रूप में मीटर की दूरी पर उपयोग नहीं कर सकते के साथ

। एक साथ $ ज्यामिति का उपयोग कर कामकाज उदाहरण के http://docs.mongodb.org/manual/reference/operator/query-geospatial/

मैंने देखा है बहुत सारे लेकिन कोई भी $ के पास के साथ: मैं निम्न तालिका पर मेरी मान्यताओं पर आधारित है। मैं क्या गलत कर रहा हूं?

+0

हम्म, आपकी क्वेरी सही ढंग से निर्माण है, लेकिन मुझे यकीन है कि क्यों नेवला एक फिट फेंक है नहीं कर रहा हूँ! – Derick

+1

@ डेरिक जो मैंने सोचा था। और इस तरह का उपयोग मुझे इतना बुनियादी दिखता है कि अगर मैं अकेला हूं तो मैं बहुत ही आश्चर्यचकित हूं ... – syymza

उत्तर

3

मैं Mixed प्रकार का उपयोग करने के लिए किया था और मूल्यों सरणियों थे सुनिश्चित करने के लिए कुछ कस्टम मान्यता जोड़ा गया है और 2. मैं भी खाली सरणियों के लिए जाँच की लंबाई था और उन्हें null रों में बदल जाती है क्योंकि इस जब 2dsphere साथ विरल सूचकांकों का उपयोग कर के लिए आवश्यक है । (नेवला काम आते हुए आप के लिए [] करने के लिए सरणी क्षेत्रों सेट है, जो एक वैध समन्वय नहीं है!)

var schema = new mongoose.Schema({ 
    location: { type: {}, index: '2dsphere', sparse: true } 
}); 

schema.pre('save', function (next) { 
    var value = that.get('location'); 

    if (value === null) return next(); 
    if (value === undefined) return next(); 
    if (!Array.isArray(value)) return next(new Error('Coordinates must be an array')); 
    if (value.length === 0) return that.set(path, undefined); 
    if (value.length !== 2) return next(new Error('Coordinates should be of length 2')) 

    next(); 
}); 
+0

हाय महोदय, आप इस तरह की चीजों में अच्छी तरह से तैयार हैं। क्या आप मेरे खुले +50 बक्षीस प्रश्न पर एक नज़र डालेंगे: http://stackoverflow.com/questions/37733030/finding-closest-points-to-a-certain-point-given-its-coordinates-and- अधिकतम- दूर? – AndreaM16

संबंधित मुद्दे