2016-07-05 24 views
1

Mongo documentation,它說,你可以這樣做:通過Ruby驅動程序比分蒙戈全文搜索

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

當我從蒙戈控制檯運行它,但我無法弄清楚如何這工作正常通過Ruby驅動程序來做到這一點。

當我這樣做:

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

我得到

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

當我做

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

我得到的結果,但它不包括分數和日誌信息沒有顯示它使用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

結構Ø mongo驅動程序中的f命令與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's answer is spot-on。添加到它,這也適用:

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