2011-09-18 29 views
6

Tôi có các lược đồ sau; Địa chỉ là vị trí được mã hóa địa lý và Đại lý có nhiều địa chỉ. Câu hỏi của tôi là, nếu tôi muốn có thể thực hiện tìm kiếm không gian địa lý trên cơ quan dựa trên địa chỉ của nó thì tôi có cần phải lập chỉ mục bằng cách nào đó ở cấp đại lý (đã được lập chỉ mục ở cấp lược đồ địa chỉ) không?Tôi có thể/nên lập chỉ mục một tài liệu được nhúng trong Mongoose không?

Ngoài ra, tôi đang gặp khó khăn khi tìm thông tin về cách tìm dựa trên tài liệu lồng nhau. Trong kịch bản này, thậm chí có thể làm những gì tôi đang hy vọng hay tôi nên mở rộng cấu trúc miền của mình một chút và có một "AgencyAddress"? Cách tiếp cận này dường như là một chút RDBMS đối với tôi nhưng tôi cũng có thể thấy được những ưu điểm của nó.

Tôi hơi bối rối về cách tôi có thể sử dụng ObjectId refs từ Agency (hoặc đối tượng bridge AgencyAddress) mà không có một liên kết ngược ngược trở lại từ địa chỉ. Tôi không muốn có liên kết ngược vì địa chỉ sẽ được sử dụng bởi một số đối tượng khác trong ứng dụng.

Cảm ơn!

var AddressSchema = new Schema({ 
    name  : {type: String, default : ''}, 
    street1  : {type: String, default : ''}, 
    street2  : {type: String, default : ''}, 
    city  : {type: String, default : '', required: true}, 
    state  : {type: String, required : true}, 
    zip   : {type: String, default ''}, 
    country  : {type: String}, 
    location : {longitude: Number, latitude:Number} 
    type  : {type: String, enum:['agent', 'agency', 'registrant'], index:true} 
    created_at : {type: Date, default: Date.now}, 
    updated_at : {type: Date, default: Date.now} 
    primary  : {type: Boolean, default: false} 
}); 

AddressSchema.index({location: '2d'}); 

Cơ quan:

var AgencySchema = new Schema({ 
    name   : {type : String, default : '', required : true}, 
    Type   : {type : String, enum['medical', 'disaster-service', 'local-law', 'state-law', 'federal-law'], index:true}, 
    Addresses : [Address], 
    created_at : {type : Date, default : Date.now}, 
    updated_at : {type : Date, default : Date.now} 
}); 

Trả lời

11

Tôi không có kinh nghiệm với các mongoose, vì vậy tôi có thể giải thích MongoDB indexing nói chung. Từ câu hỏi của bạn, tôi hiểu rằng nhiều tài liệu địa lý Address được nhúng vào Đại lý.

Nếu bạn đang sử dụng phiên bản mongodb < = 1.8, bạn không thể lập chỉ mục các tài liệu được mã hóa địa lý lồng nhau. Nhưng tính năng được thêm từ phiên bản 1.9. Tôi đã sử dụng thành công trong vài tháng cho cùng một loại lược đồ. Nhưng đó là một nhánh phát triển (không ổn định).

phiên bản may mắn 2.0 được phát hành cách đây một tuần. Và ổn định của nó. Hãy xem liên kết 2.0 Release Notes để biết thêm thông tin.

Và bạn không thể lập chỉ mục trực tiếp trên tài liệu được nhúng.

nó đã được thực hiện như thế này từ vỏ MongoDB

db.Agency.ensureIndex({"Address.location": 2d}) 

Tôi không biết cú pháp chính xác cho cầy mangut, có thể là như

AgencySchema.index({'Address.location': '2d'}); 

việc kiểm tra này ra mongodb indexing để biết thêm

+0

Ahh, đó là người đàn ông hoàn hảo. Cảm ơn bạn. – Chance

+0

Nó không cảm thấy hoàn hảo với tôi. Có thực sự là một yêu cầu mà chỉ mục được tạo ra trong giao diện điều khiển mongo ?! – Greg

+1

@Greg "Có thực sự là một yêu cầu mà chỉ mục được tạo trong giao diện điều khiển mongo", không, bạn có thể làm điều đó thông qua bất kỳ trình điều khiển ngôn ngữ nào bạn sử dụng, tôi đã nói từ console vì tôi không có kinh nghiệm với mongoose – RameshVel

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