2016-07-05 3 views
1

は、それはあなたがこれを行うことができます言う:私はMongoのコンソールから実行しますが、私はどのようにを把握できない場合に正常に動作Mongoのフルテキスト検索は、<a href="https://docs.mongodb.com/manual/reference/operator/query/text/#return-the-text-search-score" rel="nofollow">Mongo documentation</a>で

db.articles.find(
    { $text: { $search: "cake" } }, 
    { score: { $meta: "textScore" } } 
) 

それはRubyドライバを介して行います。

私はこれを行うとき:

articles.find('$text': { '$search': 'cake' }, score: { '$meta': 'textScore' }) 

を私は

articles.find({ '$text': { '$search': 'cake' } }, score: { '$meta': 'textScore' }) 

を行うと、私は結果を得るが、それはスコアやログメッセージが含まれていません

Mongo::Error::OperationFailure: unknown operator: $meta (2) 

を取得score: { $meta': 'textScore' }を使用していることを示していません。

{"find"=>"articles", "filter"=>{"$text"=>{"$search"=>"cake"}}} 

私はRubyドライバとMongo CLIがそれらをMongoのクエリに変換する方法についてはあまり考えていないと思います。

私はMongoDBバージョンv3.2.7とmongo gemバージョン2.2.5を使用しています。

+0

このドライバを使用しています - https://github.com/mongodb/mongo-ruby-driver? –

答えて

1

のはmongoコマンドの構造を見てみましょう:

db.collection.find(
    <query>, 
    { score: { $meta: "textScore" } } 
) 

私たちは、コマンドは(この場合findで)二つの部分

  1. <query>
  2. options hash

構造が含まれていることがわかりo mongoドライバのfコマンドはmongoと非常によく似ています。しかし、いくつかのことは単純ではありません。 Mongoのドライバで

我々はMongo::Collection::View、チェック(link to source)を持っている:

articles.find({ '$text': { '$search': 'cake' } }.class # => Mongo::Collection::View 

だから、コードを分析した後、私はあなたがprojectionオプションを使用することができますが、それはトリッキーであることが判明:

articles.find(
{ "$text" => { "$search" => "cake" } }, 
projection: { 
    "score" => { "$meta" => "textScore" }, 
    some_field: 1 
}) 

私のテストは:

posts.find(
    { "$text" => { "$search" => "house" } }, 
    projection: { "score" => { "$meta" => "textScore" }, rooms: 1 } 
) 

結果:

{"_id"=>BSON::ObjectId('53f5c8b54465764a82fb0000'), 
"rooms"=>2.0, 
"score"=>0.5004448398576512} 
+0

ありがとう!それはそれだった。 – nicholaides

0

@ farhatmihalkoの回答はスポットオンです。これに追加するには、これも動作します:

posts 
    .find("$text": { "$search": "house" }) 
    .projection(score: { "$meta": "textScore" }, rooms: 1) 
関連する問題