2011-09-08 38 views
9

Tôi đang tìm vấn đề trong việc xác định chỉ mục không gian địa lý '2d' như được hiển thị bên dưới. Bất kỳ đầu mối như những gì đang xảy ra sai?Chỉ mục không gian địa lý trong mongodb với node.js

var Address = new Schema({ 
     loc   : {lat: Number, lng: Number }, 
     Address  : String, 
     create_date  : {type: Date, default: Date.now} 
}); 
Address.index ({ 
     loc : "2d" 
}); 

Nó ném lỗi như,

events.js:45 throw arguments[1]; // Unhandled 'error' event ^Error: point not in range at [object Object]. (/cygdrive/c/Personal/software/ nodejs/NODE/no de_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:503:20)

EDIT: Bổ sung chứng

var Address = new Schema({ 
     type    : {type: String, enum: ['Apartment', 'House', 'Serviced Apartment'], default: 'Apartment'}, 
     loc    : {lat: Number, lng: Number }, 
     Address   : String, 
     create_date  : {type: Date, default: Date.now} 
}); 

/* 
Address.index ({ 
    loc : "2d" 
}); 
*/ 

mongoose.connect('mongodb://127.0.0.1:27017/test123', function(err) { 
    if (err) { 
     console.log("error in mongo connection"); 
     throw err; 
    } 
    console.log("connected to mongo"); 
}); 

var RentModel = mongoose.model('Rent', Address); 



socket = io.listen(app); 

socket.sockets.on('connection', function(client){ 

     console.log('inside on connection'); 

     client.on('register', function(msg){ 
       console.log("msg.geometry.type", msg.geometry.type); 

       var rent = new RentModel(); 
       rent.type = 'Apartment'; 
       rent.loc.lat = 23; 
       rent.loc.lng = 56; 
       rent.Address = "LLLLLLLLIIIIIIIOOOOOOONNNNNNNN" 

       console.log("before save"); 
       rent.save(function(err){ 
        console.log("rent.save start"); 
        if(err) { 
         throw err; 
         console.log("error in save"); 
        } 
        console.log("saved"); 

       }); 

      }); 


      RentModel.find({loc : { $near : [20, 50], $maxDistance: 30 }} , function(err, docs){ 
       if (err) { 
        console.log("error in finding near", err); 
        throw err; 
       } 
       console.log('docs.length : ' , docs.length); 
       console.log('docs : ',docs) 
      }) 
+0

Có vẻ như bạn cũng đang sử dụng Mongoose. Bạn có một đối tượng/truy vấn thực tế mà bạn đang thực hiện không? Vấn đề có thể là trong trình điều khiển Node, nó có thể là trong Mongoose hoặc nó có thể được trong mã, vì vậy chúng tôi cần thêm một chút để tiếp tục. –

+0

Có, bạn đã đúng. Tôi đang sử dụng mongoose. Tôi đã chỉnh sửa câu hỏi ở trên và thêm mã. lưu đang diễn ra đúng cách. Khi tôi tìm thấy nó phàn nàn về chỉ mục và khi tôi thêm chỉ mục, nó nói, "điểm không nằm trong phạm vi" – user644745

+1

Vâng, tôi đã thay đổi tên thuộc tính từ vị trí thành "vị trí" và thay đổi "2d" thành '2d' và có vẻ như , Nó đang làm việc bây giờ. Điều này thật kỳ lạ. – user644745

Trả lời

8

Nó cũng đáng chú ý là bạn sẽ muốn longitude đến trước vĩ độ trong mảng của bạn. Điều này sẽ không ảnh hưởng đến bạn khi bạn đang sử dụng 2D, nhưng nó sẽ xảy ra khi bạn đang sử dụng 3D. Về mặt toán học có nghĩa là kinh độ là tọa độ X và vĩ độ là tọa độ Y (x, y), nhưng hầu hết chúng ta quen thuộc với lat trước khi dài (và một trong những cuốn sách Mongo tốt nhất có một ví dụ với lat trước khi dài , nhưng nó không bao gồm 2D).

Cuối cùng, bạn có thể muốn sử dụng 3D như tính toán 2D không chính xác khi bạn di chuyển ra khỏi đường xích đạo.


UPDATE: 2015/12/08 Trên đây là không còn phù hợp - vui lòng xem tài liệu câu trả lời cập nhật/API

+0

Đây là một thông tin tốt. – user644745

+0

vui vì bạn thấy nó hữu ích :) Nhân tiện, có hai hướng dẫn tương tác tuyệt vời ở đây (bao gồm một hướng dẫn dành riêng cho địa lý): http://www.mongly.com/ – Jordan

+0

Cảm ơn bạn một lần nữa vì thông tin. Tôi sẽ thử cái này – user644745

0

Bạn có thể muốn có một số tài liệu tham khảo ở đây về cách để làm điều đó :) Và đối với một người đến sau. Chỉ trong trường hợp, ai đó quan tâm

http://www.jmanzano.es/blog/?p=592

+0

Cảm ơn bạn Javier. Điều này đã được giải quyết lâu trở lại .. Dù sao, tôi làm điều đó như someSchema.index ({g_location: '2d'}); – user644745

Các vấn đề liên quan