我在Mongodb中使用聚合方法来进行文本搜索。我已经尝试了各种方法,仍然找不到正确的方法来过滤我的结果。我已经设置了一个索引,它只使用$ text搜索工作正常,并且只对查询工作正常。
这是我进行文本搜索的代码:
Model.aggregate([
{ $match: { $text: { $search: searchValue } } },
{ $project: { displayTitle: 1, title: 1, body: 1, _type: 1, _id: 1, score: { $meta: "textScore" } } },
{ $match: { score: { $gt: 1.0 } } }
], function (err, models) {
})
但是我希望能够通过此查询进一步过滤模型:
Model.find({_parentIds: {$in: arrayOfIds}})
我原以为这会起作用:
Model.aggregate([
{ $match: { $text: { $search: searchValue }, _parentIds: {$in: arrayOfIds} } },
{ $project: { displayTitle: 1, title: 1, body: 1, _type: 1, _id: 1, score: { $meta: "textScore" } } },
{ $match: { score: { $gt: 1.0 } } }
])
但遗憾的是,事实并非如此。有没有人试过这个或者我错过了什么?
这是我正在搜索的示例集合:
[{
displayTitle: "first item",
title: "first_item",
_type: "item",
_parentIds: ["123", "234"]
}, {
displayTitle: "second item",
title: "second_item",
_type: "item",
_parentIds: ["123", "234"]
}, {
displayTitle: "third item",
title: "third_item",
_type: "item",
_parentIds: ["345", "456"]
}]
我目前的搜索结果如下:
searchValue = "item"
arrayOfIds = ["345"];
并且只会期待这份文件:
{
displayTitle: "third item",
title: "third_item",
_type: "item",
_parentIds: ["345", "456"]
}
谢谢!
答案 0 :(得分:1)
文字分数为0.75。因此,将匹配过滤器更改为大于0.5可以正常工作。
修改投影以排除正文,_id并包含父ID。
使用此查询创建索引。
db.textcol.aggregate([
{ $match: { $text: { $search: "item" }, _parentIds: {$in: ["345"]} }} ,
{ $project: { displayTitle: 1, title: 1, _type: 1, _id: 0, _parentIds :1, score: { $meta: "textScore" } }},
{ $match: { score: { $gt: 0.5 } } }
])
运行此查询。
{
"displayTitle": "third item",
"title": "third_item",
"_type": "item",
"_parentIds": ["345", "456"],
"score": 0.75
}
输出:
const int &r {100};