2015-12-07 77 views
0

我有如下定義文章模型:貓鼬如何加入搜索結果

var ArticleSchema = new Schema({ 
    type: String 
    ,title: String 
    ,content: String 
    ,hashtags: { 
     type: [String] 
     ,index: true 
    } 

    ,meta: { 
     tags: [String] //anything 
     ,category: String 
    } 

現在我需要按類別做搜索,通過標籤和關鍵字。

var words = queryString.split(' ') 

    if (searchType === constant.searchTypes.category) { 
     criteria['meta.category'] = {$in: words} 
    } 
    else if (searchType === constant.searchTypes.tag) { 
     //todo 
    } 
    else if (searchType === constant.searchTypes.keyword) { 
     //todo 
    } 

    var query = Article.find(criteria) 
    helper.populateCommonFieldsForQuery(query) 
    query.exec(function(err, articles) { 
     if (err) 
      return next(err) 
     return res.json(articles) 
    }) 

queryString只是'word1 word2 word3'格式。由於一篇文章只有一個類別,因此按類別搜索很容易。我可以在前提中簡單地使用$。

但文章有多個標籤,我想列出的所有文章,他們的任何標籤的匹配任何的查詢詞(即集相交不爲空)

我也需要通過關鍵字做搜索,我需要檢查標題或內容匹配。我可以在一個查詢中做到這一點嗎?

回答

0

criteria['meta.tags'] = {$in: words}表達可用於tags太。而$or操作,可用於查詢標題和內容的值。
MongoDB官方文檔:https://docs.mongodb.org/manual/reference/operator/query/

其實問題不清楚。如果條件爲searchTypes。 如果條件不允許,我寧願下面的代碼(我沒有測試);

var words = queryString.split(' ') 
var criteria = $or[ 
    { 'meta.category': {$in: words} }, 
    { 'meta.tags': {$in: words} }, 
    { title: {$in: words} }, 
    { content: {$in: words} }, 
] 
var query = Article.find(criteria) 
helper.populateCommonFieldsForQuery(query) 
query.exec(function(err, articles) { 
    if (err) 
     return next(err) 
    return res.json(articles) 
}) 

索引所有查詢的字段不應被跳過。

祝你好運。

+0

但是標記字段是一個數組。標題和內容都是長字符串。 – OMGPOP

+0

標籤正在工作。但內容不會工作,因爲它不符號化 – OMGPOP

+0

'$或'運營商只是執行邏輯'或'喜歡這個過程'$或[表達式1,表達式2,...]'如果表達式值TRUE;返回true。所以,返回適當的文件。另一個問題必須是關於「內容」的問題。如果你能不能解決問題編輯您的問題添加自己的MongoDB和你的代碼,如果有問題的不同,其使用一些樣本文檔。我會盡力幫助你。 – efkan