2016-10-06 73 views
1

我在mongo db中有一個集合,稱爲被稱爲頁面。 因爲我有一系列稱爲文章的文檔。 並且在那個數組中的每個文檔中,我都有一個文章編號和文章內容。

我想要做的是展開文章,然後使用$文本搜索文章內容中的單詞。但$文本必須處於管道的第一階段。

如果我在管道的第一階段執行而沒有展開,現在會發生什麼情況,即首次搜索文本時,它會返回該文檔的所有其餘文章,而不管文本是否具有文本。

注意:Pages集合包含大量文檔。

樣品採集:

{ 
    pageNo: 1, 
    articles:[{ 
      articleNo:1, 
      articleContent:"cat dog cat dog" 
     },{ 
      articleNo:2, 
      articleContent:" Some random text" 
     }] 
}, 
{ 
    pageNo: 2, 
    articles:[{ 
      articleNo:1, 
      articleContent:"Some random text" 
     },{ 
      articleNo:2, 
      articleContent:"cat dog cat" 
     }] 
} 

預期輸出:說我搜索 「貓」

{ 
    pageNo:1, 
    articles:[{ 
      articleNo:1, 
      articleContent:"cat dog cat dog" 
     }] 
}, 
{ 
    pageNo:2, 
    articles:[{ 
      articleNo:2, 
      articleContent:"cat dog cat" 
     }] 
} 
+2

請添加示例文檔和您的預期結果。無論如何,如果由於文本索引而使用'$ text',那麼你是對的,索引只能在管道的第一階段使用。您仍然可以在'$ unwind'之後搜索文本並獲得所需的結果,但不會使用索引。如果這是一項要求,請更改您的模式。 – TomG

+0

@Tom是可能的文章索引文章內容 –

+0

這是可能的,但只有在'$匹配'階段和只有當第一階段的聚合管道。所以它不會給你所需的結果。看到我的答案。 – TomG

回答

1

下面的答案將返回您想要的結果。在text索引的幫助下,第一個$match僅用於過濾其中沒有cat的文檔。如果你不使用這個階段,結果將是相同和正確的,但可能會更慢。

db.pages.aggregate([ 
    { 
     $match: { 
      $text: { 
       $search: "cat" 
      } 
     } 
    }, 
    { 
     $unwind: '$articles' 
    }, 
    { 
     $match: { 
      'articles.articleContent': /cat/ 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       _id: '$_id', 
       pageNo: '$pageNo' 
      }, 
      articles: { 
       $push: '$articles' 
      } 
     } 
    }, 
    { 
     $project: { 
      _id: '$_id._id', 
      pageNo: '$_id.pageNo', 
      articles: 1 
     } 
    } 
]) 
+0

謝謝,但要使其更快,我將不得不通過展平數據結構來更改模式? –

+0

如果您想使用索引並僅檢索一篇文章,那麼模式需要更改。 – TomG