2016-09-30 1 views
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); 
       } 

      }    
     }); 

텍스트로 필터를 지정하고 동시에 지점에 가까워 질 수 있습니까?

지금은 직원 컬렉션을 사용하고 있지 않지만 비즈니스 이름, 직원 이름 및 서비스 이름을 동시에 검색하는 경우 변경해야하는 사항은 무엇입니까?

+0

질문이 명확하지 않습니다. 최적화 할 현재 검색어는 무엇입니까? 당신은 mongodb에서'index'를 보았을 수도 있습니다 –

+0

결과를 얻기 위해 여러 콜렉션을 효율적으로 검색하는 것 같지 않습니다. 콜렉션을 사용하여 인덱스 된 텍스트 만 검색하면 필드는 다음과 같을 것입니다 : name_business name_employee name_service, 모두 연결됨. 그런 다음 이전 쿼리에서 찾은 모든 비즈니스에서 위치별로 필터링하십시오. –

답변

0

귀하의 비즈니스 모델은 스키마의 변화는 위치에 인덱스를 생성해야하고, 직원을 기반으로 찾기 사업을 위해 당신은 당신이 지리적 할 수 schema.Then 사업에 직원 ID를 추가 할 필요가있다

var BusinessSchema = new Schema({ 
      business_id: { 
       type: String, 
       required: true, 
       unique:true 
      }, 
      name: { 
       type: String, 
       required: true 
      }, 
      email: { 
       type: String, 
      },  
      description:{ 
       type: String 
      }, 
      address:{ 
       country:{ 
        type:String, 
       }, 
       city:{ 
        type:String 
       }     
      }, 
      location : { 
       type: [Number], 
       index: '2dsphere' 
      },  
      services:[{ 
       type: Schema.Types.ObjectId, 
       ref: 'Service' 
      }], 
      employees:[{ 
       type: Schema.Types.ObjectId, 
       ref: 'User' 
      }] 
     }, 
     { 
      timestamps: true 
     }); 

해야한다 mongodb의 가까운 쿼리.