在Mongo文档中,您可以执行以下操作:
db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
)
当我从mongo控制台运行它时,效果很好,但是我不知道如何通过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。
让我们看一下mongo
命令的结构:
db.collection.find(
<query>,
{ score: { $meta: "textScore" } }
)
我们看到该命令包含两部分(在本例中为find
)
<query>
options hash
mongo-driver中的命令结构与mongo非常相似。但是有些事情并不简单。
在mongo-driver中Mongo::Collection::View
,检查(链接到source):
articles.find({ '$text': { '$search': 'cake' } }.class # => Mongo::Collection::View
因此,在分析代码之后,我发现您可以使用projection
option,但这很棘手:
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}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句