javascript - 除非查询为空,否则 Mongoose-fuzzy-searching 返回空数组
问题描述
我正在开发一个类似 wiki 的网站组件,并且正在尝试实现模糊搜索。我在 npmjs 上找到了一个流行的 Node.js 插件,用于模糊搜索使用 Mongoose 处理的云 mongoDB 数据库。我安装并保存了 mongoose-fuzzy-searching 并将其连接到我的模型和路线。然后我更新了所有模型,为我想要索引的字段重新保存了每个模型的值。我似乎可以在模型上调用该函数,并且似乎 MongoDB Atlas 上有一个索引,但它返回一个空数组而不是任何结果。2个问题:
- 我做错了什么,还是我错过了什么?
- 有没有更好的免费节点库?(*在 heroku 上免费,我认为这消除了 flexsearch 作为选项)
这是我的代码。
模型:
const mongoose = require("mongoose"),
mongoose_fuzzy_searching = require('mongoose-fuzzy-searching'),
Schema = mongoose.Schema;
const IssueTemplateSchema = new Schema({
name: String,
info: String,
image: String,
tags: [{type: Schema.Types.ObjectId, ref: "Tag"}],
active: {type: Boolean, default: true},
instances: [{type: Schema.Types.ObjectId, ref: "LocalIssue"}],
issues: {type: Schema.Types.ObjectId, ref: "Issuegraph" },
});
IssueTemplateSchema.plugin(mongoose_fuzzy_searching, { fields: ['name'] });
module.exports = mongoose.model("IssueTemplate", IssueTemplateSchema);
所有问题模板模型的更新:
const express = require('express'),
router = express.Router(),
Issue = require('../api/issue/issue.template');
router.get("/createIndex", async (req, res) => {
Issue.find({}, async (err, issues) => {
if(err){console.log(err)}else {
for(issue of issues){
if(err){console.log(err)}else{
const name = issue.name;
await Issue.findByIdAndUpdate(issue._id, {name: name}, {strict: false});
}
}
}
});
return res.send("done");
});
路线:
router.get("/search", (req, res) => {
console.log(req.query.target);
let searchTerm = "";
if(req.query.target){
searchTerm = decodeURIComponent(req.query.target.replace(/\+/g, ' '));
}
Issue.fuzzySearch(searchTerm, (err, issue)=> {
if(err){
console.log(err);
res.send("Error fuzzy searching: " + err);
} else {
returnResult(issue);
}
});
function returnResult(result) {
console.log(result);
return res.send(result);
}
});
当我跑
npm install --save mongoose-fuzzy-searching
我收到一个错误,说它需要 mongoose 5.10,我有 5.11,但它似乎至少可以插入。不明白为什么当我通过 Postman 发送请求时,我收到一个空数组。如果我将查询留空,那么我会得到一切。我已重置节点并正在使用 mongoDB Cloud,我看到已创建索引。是否可能需要重置云数据库(我不知道这样的事情),或者重置服务器是否足够?我的知识水平是:学习成为一名自由 Web 开发人员,并希望获得任何关于最佳实践的一般提示等。
解决方案
看起来我的更新操作实际上并没有更新我想要更新的字段,因为findByIdAndUpdate()
返回了一个查询并且我没有执行该查询(使用.exec()
)。Await 也被错误地使用了,因为它的目的不仅仅是像我想的那样在异步函数中暂停,而是等待一个 Promise 实现。查询不是承诺,等待是专门针对承诺的。在我了解这些细节之前,我通过使用.find()
, then .markModified("name")
, then以另一种方式解决了我的问题.save()
。一旦我这样做了,这一切都奏效了!
推荐阅读
- arrays - Julia - 过滤数组的多个条件
- docker - 如何在 Scrapy-Splash 中解决 504 HTTP 代码
- awk - 当我使用 awk 替换一个值时,为什么我的字段分隔符会弄乱?
- angular - 尝试填充时显示 [Object Object] 的 Kendo DropdownList
- c++ - float 和 unsigned char [4] 之间的转换
- php - Podio 在尝试添加在其字段中具有多个标签的项目时抛出 PodioBadRequestError invalid_value int
- excel - 在 VBA 中使用循环删除范围并在每次迭代时更改范围
- python - VsCode 在运行模式和调试模式之间的不同行为
- javascript - 如何使此代码仅显示 600px 及以上?(我不希望它出现在手机或平板电脑上)
- swift - 搜索栏必须显示一个结果,其中每个都必须包含所有搜索的单词,而不管它们的编写顺序如何?