0
세 가지 콜렉션 : business, sevice, employee가 있습니다.몽고 (Mongodb), 다양한 콜렉션에서 텍스트 및 위치 정보 검색
서비스 별 검색 (전체 텍스트 제외), 종업원 및 각 사업의 위치 정보 검색이 필요하며 비즈니스 만 표시해야합니다.
var BusinessSchema = new Schema({
business_id: {
type: String,
required: true,
unique:true
},
name: {
type: String,
required: true
},
email: {
type: String,
},
description:{
type: String
},
location:{
country:{
type:String,
},
city:{
type:String
},
coord:[Number]
}
services:[{
type: Schema.Types.ObjectId,
ref: 'Service'
}]
},
{
timestamps: true
});
var ServiceSchema = new Schema({
business:{
type: Schema.Types.ObjectId,
ref: 'Business'
},
category:{
type: Schema.Types.ObjectId,
ref: 'Category',
index:true
},
name: {
type: String,
required: true,
index:true
},
employee: [{
type: Schema.Types.ObjectId,
ref: 'User'
}],
{
timestamps: true
});
var UserSchema = new Schema({
birthday:Date,
first_name: {
type: String,
required: true
},
last_name: {
type: String,
required: true
},
email: {
type: String,
unique: true,
match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, 'Please fill a valid email address'],
required: true
},
password:{
type: String
},
{
timestamps: true
});
검색어를 최적화하기 위해 어떤 변경을해야합니까?
Service.distinct('business',filter_services)
.exec(function (err, business) {
if (err) {
return cb({ status: 400, message: err }, null);
} else {
if(business.length > 0){
var filter_business = [{is_active:true},{is_approved:true}]
filter_business.push({_id:{$in:business}})
filter_business.push({location.coord:input_coord}})
filter_business = {$and:filter_business}
Business.find(filter_business)
.select('name services')
.exec(function (err,result){
if(err){
return cb({ status: 400, message: err }, null);
}
else{
if(result.length > 0){
var total = result.length;
}
return cb(null, result);
}
})
}
// si no hay business en el primer query, se retorna [].
else{
return cb(null, business);
}
}
});
텍스트로 필터를 지정하고 동시에 지점에 가까워 질 수 있습니까?
지금은 직원 컬렉션을 사용하고 있지 않지만 비즈니스 이름, 직원 이름 및 서비스 이름을 동시에 검색하는 경우 변경해야하는 사항은 무엇입니까?
질문이 명확하지 않습니다. 최적화 할 현재 검색어는 무엇입니까? 당신은 mongodb에서'index'를 보았을 수도 있습니다 –
결과를 얻기 위해 여러 콜렉션을 효율적으로 검색하는 것 같지 않습니다. 콜렉션을 사용하여 인덱스 된 텍스트 만 검색하면 필드는 다음과 같을 것입니다 : name_business name_employee name_service, 모두 연결됨. 그런 다음 이전 쿼리에서 찾은 모든 비즈니스에서 위치별로 필터링하십시오. –