我想使用 $gt 運算子限制文本分數。
使用 find 功能,我可以根據文本相似度從大到小對文本分數進行排序。我可以通過將等級限制為 1 來獲得得分最高的游標。
deneme = user.find(
{ '$text': { '$search': "dogan can" } },
{ 'score': { '$meta': "textScore" }})
deneme_sort = deneme.sort([('score', {'$meta': 'textScore'})]).limit(1)
但我不希望列出文本分數低于我給出的值的那些。
例如,我不希望低于 1.5 的文本分數出現在串列中。我正在嘗試為此使用“$gt”運算子,但出現錯誤。
deneme = user.find(
{ '$text': { '$search': "dogan can" } },
{ 'score': { '$meta': "textScore"}}, {'score': { '$gt': 1.5 } })
TypeError: skip must be an instance of int
它給出了這個錯誤,因為 find 函式只能取兩個值。
我正在嘗試使用“$and”運算子進行查詢。這次它不識別“$meta”運算子。或者'$gt' 運算子必須采用兩個值。
deneme = user.find({ '$text': { '$search': "dogan can" }} ,
{'$and':[{ 'score': { '$meta': "textScore" }},{'score': { '$gt': 1.5 }}]})
doc = []
for doc in deneme:
print(doc)
Expression $gt takes exactly 2 arguments. 1 were passed in., full error: {'ok': 0.0, 'errmsg': 'Expression $gt takes exactly 2 arguments. 1 were passed in.', 'code': 16020, 'codeName': 'Location16020'}
我剛開始學習mongodb。你能幫助我嗎?
uj5u.com熱心網友回復:
我認為您的要求已記錄在此處。簡而言之 - 您將需要使用聚合框架,以便您可以有 3 個階段來完成以下各項:
- 在一個階段執行初始
$text搜索$match - 通過
$addFields階段將文本分數保留為檔案的一部分 - 使用附加階段針對該新分數欄位
$match執行過濾。$gt
給定一個包含以下檔案的集合:
test> db.foo.find()
[
{ _id: 1, key: 'dogan can' },
{ _id: 2, key: 'dogan' },
{ _id: 3, key: 'can' },
{ _id: 4, key: 'abc' }
]
文本搜索dogan can將回傳前三個檔案:
test> db.foo.aggregate([ { $match: { $text: { $search: "dogan can" } } },{$addFields:{score:{$meta:'textScore'}}}])
[
{ _id: 3, key: 'can', score: 1.1 },
{ _id: 1, key: 'dogan can', score: 1.5 },
{ _id: 2, key: 'dogan', score: 1.1 }
]
附加最后一個$match(使用 的過濾器1.2),只回傳一個檔案:
test> db.foo.aggregate([ { $match: { $text: { $search: "dogan can" } } },{$addFields:{score:{$meta:'textScore'}}},{$match:{score:{$gt:1.2}}}])
[
{ _id: 1, key: 'dogan can', score: 1.5 }
]
如果需要,您當然也可以$sort在樂譜中加入一個階段。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/527224.html
