我是一名从事学校项目的实习生。我正在使用 Node、Express 和 Mongo 开发 REST API。 到目前为止,我成功完成了整个 CRUD,但我想通过添加文本搜索来改进我的工作。我希望它搜索数据库并仅返回与我的查询参数相对应的结果(而不是获取所有集合的数据并在之后进行搜索)。 例如,我有一个用户集合,我希望用户能够通过用户名搜索朋友。
我尝试将索引添加到我的模型中,或将“text: true”项添加到我想要在模型中用作搜索条件的特定字段,如下所示:
const userSchema = new Schema({
username: {
type: String,
required: true,
min: 3,
max: 15,
text: true
},
...
然后,我从路由器中的 URL 获取查询文本,并将其传递给我的控制器函数(它有效,我通过 console.logged 它)。
.get(async (req, res) => {
try {
if (req.query.pseudo) {
const searched = req.query.pseudo
const usersSearched = getUsersByTextSearch(searched)
return res.send(usersSearched)
}
const users = await getUsers()
return res.send(users)
} catch (e) {
console.error(e)
return res.status(500).send(e.message)
}
})
然后我在控制器中尝试了几件事,但我总是得到一个空对象作为响应:
const getUsersByTextSearch = async (search) => {
const users = await User.find({
$text:
{
$search: search,
$language: 'fr',
$caseSensitive: false
}
})
return users
}
或
const getUsersByTextSearch = async (search) => {
const users = await User.find({ pseudo: { $text: search, $options: 'i' } })
return users
}
或
const getUsersByTextSearch = async (search) => {
const users = await User.find({ pseudo: { $text: `${search}`, $options: 'i' } })
return users
}
你能告诉我我的代码有什么问题/如果我使用了错误的工具吗?
let users = await User.find({
pseudo: { $regex: `${search}`, $options: "i" } ,
});
查询通过考虑具有不区分大小写选项的
pseudo
变量来搜索 search
与正则表达式模式匹配的文档。