2016-06-28 13 views
4

は、私は次のdb /コレクション作成するとマッチした上でリターンのみ配列要素:私は配列arr上でテキスト検索を行うと、検索に一致する配列要素のみを取得したいテキスト検索が

use articles 

db.stores.insert([ 
      {_id : 1, arr : ['abc xyz', 'def']}, 
      {_id : 2, arr : ['jadskf', 'ljh abc']}]) 

db.stores.createIndex({"arr" : "text"}) 

を。例えば

> db.stores.find({$text : {$search : "abc"}}) 
{ "_id" : 1, "arr" : [ "abc xyz", "def" ] } 
{ "_id" : 2, "arr" : [ "jadskf", "ljh abc" ] } 

理想的には私は最初の文書におけるarrの最初の要素得たい:abc xyzと第2の文書にarrの唯一の第二の要素:ljh abc、および一致した文書の_idも含まれます。

これは可能ですか?もしそうなら、どうですか?

私が欲しいのは、arr要素の単純投影ではなく、一致が発生したarrの要素です。

私はMongo 3.2.7を使用しています。

+0

ネストされた配列コレクションから取得するための[mongoDBクエリの可能な複製](http://stackoverflow.com/questions/37836891/mongodb-query-for-retrieving-from-nested-array-collection) –

+0

@LuizdePráこれは少し違う問題 – profesor79

答えて

0

私の最初の考えは、$elemMatchを使用でき、問題は解決しましたが... $elemMatchにはテキスト検索がありません。

他の角度から見ると、この場合正規表現を使用することができます。最初の高価なスキャンスルーコレクションがテキスト検索インデックスで行われるため、正規表現は完璧なソリューションになります。

db.stores.find({ 
    $text : { 
     $search : "abc" 
    } 
}, { 
    arr : { 
     $elemMatch : { 
      $regex : /abc/i 
     } 
    } 
}) 

コメント歓迎!

+0

それは問題を解決しますが、最適ではありません。 2回目の検索(2回目のデータセット全体ではないことに同意する)の他に、テキスト検索のセマンティクスは単純な正規表現とは異なります。たとえば、ストップワード、ステミングなどがテキスト検索で使用されます。 Mongoはマッチが起こる場所を内部的に知っていますが、簡単にそれを公開するとは思われません。 –

+0

@CassioPereiraは同意しますが、 '$ text'検索は最初のパイプライン段階でのみ使用できるので、この問題では集約フレームワークでも役に立ちます(問題は2回繰り返す必要があるということです) – profesor79