Đây là yêu cầu rất phổ biến trong trường hợp sử dụng bộ lọc địa lý và tìm kiếm văn bản trong một trường hợp sử dụng không may được hỗ trợ trực tiếp bởi mongodb.
Mã dưới đây sử dụng trình điều khiển mongoose, lọc tài liệu đầu tiên dựa trên vị trí (kinh độ và vĩ độ) và sau đó thêm bộ lọc dựa trên cụm từ tìm kiếm.
var area = {
center: [51, -114], //lng = 51 and lat = -114
radius: 100,
unique: true //this option is deprecated from MongoDB 2.6 on as mongodb no longer returns duplicate results
};
var query = Post.where('loc').within().circle(area) //Step 1: filter based on location
//Step 2: Next filter on the basis of searched text
.where({
$text: {
$search: <searchTerm>
}
}, {
score: {
$meta: 'textScore'
}
})
//Step 3: Filter any document fields that should not be returned in the result
.select({
"val1": 0,
"val2": 0
});
//Execute the query
query.exec(function (err, result) {
if (err) {
//return error in the response
}
//return result object in the response
});
Trong mã này "Post" là một cái gì đó giản đồ cầy mangut như dưới đây
var PostSchema = new Schema({
title: String,
description: String,
loc: {
type: [Number], // [<longitude>, <latitude>]
index: '2d' // create the geospatial index
}
//some other fields
}
module.exports = mongoose.model('Post', PostSchema);
Ngoài ra cho khu vực tìm kiếm, có những lựa chọn khác có sẵn như hộp
var lowerLeft = [40.73083, -73.99756]
var upperRight= [40.741404, -73.988135]
query.where('loc').within().box(lowerLeft, upperRight)
Đối với cả Định vị tìm kiếm và tìm kiếm văn bản để hoạt động, đảm bảo có chỉ mục trên trường địa phương và trường văn bản. Thêm chi tiết ở đây. loc Search và text search
tôi có thể sử dụng $ lt và $ gt khai thác nếu vĩ độ và kinh độ được lưu trữ trong một mảng ; một cái gì đó như- loc: [50.433234,20,220123] –