mongoose-fuzzy-searching은 MongoDB의 문서에서 퍼지 검색을 가능하게 하는 간단하고 가벼운 플러그인입니다. 이 코드는 이 기사를 기반으로 합니다.
npm을 사용하여 설치
$ npm i mongoose-fuzzy-searching
아니면 실을 사용해서
$ yarn add mongoose-fuzzy-searching
시작하기 전에 모범 사례를 통해 문제를 방지하려면 모든 사용 중단 경고를 올바르게 처리하세요.
플러그인이 인덱스를 생성하도록 하려면 useCreateIndex
true로 설정해야 합니다. 아래 예에서는 데이터베이스에 연결하는 방법을 보여줍니다.
const options = {
useNewUrlParser : true ,
useUnifiedTopology : true ,
useFindAndModify : false ,
useCreateIndex : true ,
} ;
mongoose . Promise = global . Promise ;
return mongoose . connect ( URL , options ) ;
아래 예에는 User
컬렉션이 있으며 firstName
및 lastName
에서 퍼지 검색을 수행하려고 합니다.
const { Schema } = require ( 'mongoose' ) ;
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
age : Number ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , { fields : [ 'firstName' , 'lastName' ] } ) ;
const User = mongoose . model ( 'User' , UserSchema ) ;
module . exports = { User } ;
const user = new User ( { firstName : 'Joe' , lastName : 'Doe' , email : '[email protected]' , age : 30 } ) ;
try {
await user . save ( ) ; // mongodb: { ..., firstName_fuzzy: [String], lastName_fuzzy: [String] }
const users = await User . fuzzySearch ( 'jo' ) ;
console . log ( users ) ;
// each user object will not contain the fuzzy keys:
// Eg.
// {
// "firstName": "Joe",
// "lastName": "Doe",
// "email": "[email protected]",
// "age": 30,
// "confidenceScore": 34.3 ($text meta score)
// }
} catch ( e ) {
console . error ( e ) ;
}
결과는 confidenceScore
키를 기준으로 정렬됩니다. 이 옵션을 재정의할 수 있습니다.
try {
const users = await User . fuzzySearch ( 'jo' ) . sort ( { age : - 1 } ) . exec ( ) ;
console . log ( users ) ;
} catch ( e ) {
console . error ( e ) ;
}
옵션에는 fields
와 middlewares
포함될 수 있습니다.
Fields 속성은 필수이며 Strings
배열 또는 Objects
배열이어야 합니다.
모든 필드에 기본 옵션을 사용하려면 해당 필드를 문자열로 전달하면 됩니다.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , { fields : [ 'firstName' , 'lastName' ] } ) ;
인수에 대한 기본 옵션을 재정의하려는 경우 해당 인수를 개체로 추가하고 원하는 값을 재정의할 수 있습니다. 아래 표에는 이 개체에 대해 예상되는 키가 포함되어 있습니다.
열쇠 | 유형 | 기본 | 설명 |
---|---|---|---|
이름 | 끈 | null | 컬렉션 키 이름 |
최소 크기 | 정수 | 2 | N-그램 최소 크기. N-그램에 대해 자세히 알아보기 |
무게 | 정수 | 1 | 텍스트 검색 점수 측면에서 인덱싱된 다른 필드와 비교하여 해당 필드의 중요성을 나타냅니다. 인덱스 가중치에 대해 자세히 알아보기 |
접두사만 | 부울 | 거짓 | 단어 시작 부분에서만 ngram을 반환합니다. (보다 정확한 결과를 제공합니다) |
탈출특수문자 | 부울 | 진실 | N-그램에서 특수 문자를 제거합니다. |
열쇠 | 배열[문자열] | null | 컬렉션 속성의 유형이 Object 또는 [Object] (예 참조)인 경우 퍼지 검색에 사용할 속성을 정의할 수 있습니다. |
예:
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
content : {
en : String ,
de : String ,
it : String
}
text : [
{
title : String ,
description : String ,
language : String ,
} ,
] ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , {
fields : [
{
name : 'firstName' ,
minSize : 2 ,
weight : 5 ,
} ,
{
name : 'lastName' ,
minSize : 3 ,
prefixOnly : true ,
} ,
{
name : 'email' ,
escapeSpecialCharacters : false ,
} ,
{
name : 'content' ,
keys : [ 'en' , 'de' , 'it' ] ,
} ,
{
name : 'text' ,
keys : [ 'title' , 'language' ] ,
} ,
] ,
} ) ;
미들웨어는 사용자 정의 pre
미들웨어를 포함할 수 있는 선택적 Object
입니다. 이 플러그인은 퍼지 요소를 생성하거나 업데이트하기 위해 이러한 미들웨어를 사용합니다. 즉, pre
미들웨어를 추가하면 플러그인이 이를 재정의하므로 사전 미들웨어가 호출되지 않습니다. 이 문제를 방지하려면 사용자 정의 미들웨어를 플러그인에 전달할 수 있습니다. 미들웨어가 먼저 호출됩니다. 전달할 수 있는 미들웨어는 다음과 같습니다.
schema.pre("save", ...)
를 나타냅니다.schema.pre("insertMany", ...)
를 나타냅니다.schema.pre("update", ...)
를 나타냅니다.schema.pre("updateOne", ...)
를 나타냅니다.schema.pre("findOneAndUpdate", ...)
를 나타냅니다.schema.pre("updateMany", ...)
를 나타냅니다.위의 미들웨어를 추가하려면 플러그인에서 직접 추가하면 됩니다.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , {
fields : [ 'firstName' ] ,
middlewares : {
preSave : function ( ) {
// do something before the object is saved
} ,
} ,
} ) ;
미들웨어는 비동기식 기능일 수도 있습니다.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , {
fields : [ 'firstName' ] ,
middlewares : {
preUpdateOne : async function {
// do something before the object is updated (asynchronous)
}
}
} ) ;
퍼지 검색 쿼리는 static
함수 또는 helper
로 사용할 수 있으며, 이를 통해 여러 쿼리를 함께 연결할 수 있습니다. 두 경우 모두 함수 이름은 놀람, 놀람, fuzzySearch
입니다.
인스턴스 메소드는 최대 3개의 매개변수를 허용할 수 있습니다. 첫 번째는 String
또는 Object
일 수 있는 쿼리입니다. 이 매개변수는 필수 입니다. 두 번째 매개변수는 추가 쿼리(예: age: { $gt: 18 }
)를 포함하는 Object
이거나 콜백 함수일 수 있습니다. 두 번째 매개변수가 쿼리인 경우 세 번째 매개변수는 콜백 함수입니다. 콜백 함수를 설정하지 않으면 결과가 Promise 내에 반환됩니다.
아래 표에는 첫 번째 매개변수(객체인 경우)에 대해 예상되는 키가 포함되어 있습니다.
열쇠 | 유형 | 불량 | 설명 |
---|---|---|---|
질문 | 끈 | null | 검색할 문자열 |
최소 크기 | 정수 | 2 | N-그램 최소 크기. |
접두사만 | 부울 | 거짓 | 단어 시작 부분에서만 ngram을 반환합니다. (더 정확한 결과를 제공합니다) 접두사 |
정확한 | 부울 | 거짓 | 개별 용어가 아닌 구문에 대한 일치 |
예:
/* With string that returns a Promise */
User . fuzzySearch ( 'jo' ) . then ( console . log ) . catch ( console . error ) ;
/* With additional options that returns a Promise */
User . fuzzySearch ( { query : 'jo' , prefixOnly : true , minSize : 4 } )
. then ( console . log )
. catch ( console . error ) ;
/* With additional queries that returns a Promise */
User . fuzzySearch ( 'jo' , { age : { $gt : 18 } } )
. then ( console . log )
. catch ( console . error ) ;
/* With string and a callback */
User . fuzzySearch ( 'jo' , ( err , doc ) => {
if ( err ) {
console . error ( err ) ;
} else {
console . log ( doc ) ;
}
} ) ;
/* With additional queries and callback */
User . fuzzySearch ( 'jo' , { age : { $gt : 18 } } , ( err , doc ) => {
if ( err ) {
console . error ( err ) ;
} else {
console . log ( doc ) ;
}
} ) ;
인스턴스 메소드와 유사하지만 몽구스 쿼리에 대한 도우미 함수인 쿼리를 사용할 수도 있습니다. 쿼리 도우미 메서드를 사용하면 mongoose의 연결 가능한 쿼리 빌더 API를 확장할 수 있습니다.
쿼리 도우미는 최대 2개의 매개변수를 사용할 수 있습니다. 첫 번째는 String
또는 Object
일 수 있는 쿼리입니다. 이 매개변수는 필수 입니다. 두 번째 매개변수는 선택사항인 추가 쿼리(예: age: { $gt: 18 }
)를 포함하는 Object
일 수 있습니다. 이 도우미는 콜백 함수를 허용하지 않습니다. 함수를 전달하면 오류가 발생합니다. 쿼리 도우미에 대해 자세히 알아보세요.
예:
const user = await User . find ( { age : { $gte : 30 } } )
. fuzzySearch ( 'jo' )
. exec ( ) ;
플러그인은 선택한 필드에 대한 색인을 생성합니다. 아래 예에서 새 인덱스는 firstName_fuzzy
및 lastName_fuzzy
입니다. 또한 각 문서에는 firstName_fuzzy
[문자열] 및 lastName_fuzzy
[문자열] 필드가 있습니다. 이 배열에는 선택한 필드에 대한 철자 바꾸기가 포함됩니다.
const mongoose_fuzzy_searching = require ( 'mongoose-fuzzy-searching' ) ;
const UserSchema = new Schema ( {
firstName : String ,
lastName : String ,
email : String ,
age : Number ,
} ) ;
UserSchema . plugin ( mongoose_fuzzy_searching , { fields : [ 'firstName' , 'lastName' ] } ) ;
즉, 이 플러그인은 문서를 생성하거나 업데이트할 때 철자 바꾸기를 생성합니다. 기존의 모든 문서에는 이러한 퍼지 배열이 포함되어 있지 않으므로 fuzzySearch
기능이 이를 찾을 수 없습니다.
기존 문서에 대한 철자 바꾸기를 생성하려면 각 문서를 업데이트해야 합니다. 아래 예에서는 User
컬렉션의 모든 문서에 대한 firstName
속성을 업데이트합니다.
const cursor = Model . find ( ) . cursor ( ) ;
cursor . next ( function ( error , doc ) {
const obj = attrs . reduce ( ( acc , attr ) => ( { ... acc , [ attr ] : doc [ attr ] } ) , { } ) ;
return Model . findByIdAndUpdate ( doc . _id , obj ) ;
} ) ;
이전 예에서는 firstName
및 lastName
퍼지 속성으로 설정했습니다. 퍼지 필드에서 firstName
제거하면 firstName_fuzzy
배열은 컬렉션에 의해 제거되지 않습니다. 각 문서에서 배열을 제거하려면 해당 값을 설정 해제해야 합니다.
const cursor = Model . find ( ) . cursor ( ) ;
cursor . next ( function ( error , doc ) {
const $unset = attrs . reduce ( ( acc , attr ) => ( { ... acc , [ ` ${ attr } _fuzzy` ] : 1 } ) , { } ) ;
return Model . findByIdAndUpdate ( data . _id , { $unset } , { new : true , strict : false } ) ;
} ) ;
우리는 모든 단위 및 통합 테스트에 jest를 사용합니다.
$ npm test
참고: 이는 DB에서 여러 동시 연결을 피하기 위해 모든 제품군을 직렬로 실행합니다.
그러면 메모리 데이터베이스를 사용하여 테스트가 실행됩니다. 어떤 이유로든 mongo 인스턴스에서 실제 연결을 사용하여 테스트를 실행하려면 환경 변수 MONGO_DB
추가하세요.
$ docker run --name mongo_fuzzy_test -p 27017:27017 -d mongo
$ MONGO_DB=true npm test
$ npm run test:unit
$ npm run test:integration
MIT 라이센스
저작권 (c) 2019 바실리스 팔라스
본 소프트웨어 및 관련 문서 파일("소프트웨어")의 사본을 취득한 모든 사람에게 사용, 복사, 수정, 병합에 대한 권리를 포함하되 이에 국한되지 않고 제한 없이 소프트웨어를 취급할 수 있는 권한이 무료로 부여됩니다. , 소프트웨어 사본을 게시, 배포, 재라이센스 부여 및/또는 판매하고, 소프트웨어를 제공받은 사람에게 다음 조건에 따라 그렇게 하도록 허용합니다.
위의 저작권 고지와 본 허가 고지는 소프트웨어의 모든 사본 또는 상당 부분에 포함됩니다.
소프트웨어는 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 어떠한 경우에도 작성자나 저작권 보유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어나 사용 또는 기타 거래와 관련하여 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다. 소프트웨어.