2017-04-15 1 views
1

저는 mongodb에서 내 단어를 발생시키는 숫자를 기반으로 내 자신의 함수를 정의하여 데이터를 정렬하고 싶습니다.몽구스에 커스텀 정렬 함수를 정의했습니다.

const RecipeSchema = mongoose.Schema({ 
    Title: { type: String }, 
    Content: { type: String }, 
    PublishDate: { type: Date }, 
}); 

그 값은 다음과 같습니다 : 나는 "알몸 케이크"를 쿼리 할 때

Title: 'Chocolate Cake', 
Title: 'Naked Cake', 
Title: 'Fruit Cake', 
Title: 'Beef' 

그래서, 나는 그

같은 결과를 싶습니다 예를 들어

,이 스키마가

Title: 'Naked Cake', // 1, because have the two words 
Title: 'Chocolate Cake', // 2 because have just one word 
Title: 'Fruit Cake', // 3 because have just one word 
// beef has no match word 

오늘이 쿼리 함수가 있습니다.

Recipe 
    .find() 
    .where({ Title: GetQueryExpression(value)}) 
    .sort({ PublishDate: -1 }) 
    .exec(callback); 

그리고 GetQueryExpression 기능은 다음과 같습니다

function GetQueryExpression(value){ 
    var terms = value.split(' '); 
    var regexString = ""; 

    for (var i = 0; i < terms.length; i++) 
     regexString += terms[i] + '|'; 

    regexString = regexString.substr(0, regexString.length - 2); 
    var result = new RegExp(regexString, 'ig'); 

    return result; 
} 

사람이 어떻게 그런 종류를 달성하는 몇 가지 아이디어가 있습니까, 단어 발생을 couting!?

답변

2

Text Search을 사용하여 대소 문자를 구분하지 않는 텍스트 검색을 수행하면 텍스트를 효율적으로 찾기 위해 tokenizer & 스템 팅 알고리즘을 사용합니다. text 색인을 정의해야하며 검색은 text에서 수행됩니다.

var mongoose = require('mongoose'); 

var db = mongoose.createConnection("mongodb://localhost:27017/testDB"); 

var RecipeSchema = mongoose.Schema({ 
    Title: { type: String }, 
    Content: { type: String }, 
    PublishDate: { type: Date }, 
}); 

RecipeSchema.index({ name: 'text', 'Title': 'text' }); 

var Recipe = db.model('Recipe', RecipeSchema); 

Recipe.find({ $text: { $search: "naked cake" } }, function(err, res) { 
    console.log(res); 
}); 
관련 문제