首页 > 解决方案 > 除非查询为空,否则 Mongoose-fuzzy-searching 返回空数组

问题描述

我正在开发一个类似 wiki 的网站组件,并且正在尝试实现模糊搜索。我在 npmjs 上找到了一个流行的 Node.js 插件,用于模糊搜索使用 Mongoose 处理的云 mongoDB 数据库。我安装并保存了 mongoose-fuzzy-searching 并将其连接到我的模型和路线。然后我更新了所有模型,为我想要索引的字段重新保存了每个模型的值。我似乎可以在模型上调用该函数,并且似乎 MongoDB Atlas 上有一个索引,但它返回一个空数组而不是任何结果。2个问题:

  1. 我做错了什么,还是我错过了什么?
  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 开发人员,并希望获得任何关于最佳实践的一般提示等。

标签: javascriptnode.jsmongoosepluginsfuzzy-search

解决方案


看起来我的更新操作实际上并没有更新我想要更新的字段,因为findByIdAndUpdate()返回了一个查询并且我没有执行该查询(使用.exec())。Await 也被错误地使用了,因为它的目的不仅仅是像我想的那样在异步函数中暂停,而是等待一个 Promise 实现。查询不是承诺,等待是专门针对承诺的。在我了解这些细节之前,我通过使用.find(), then .markModified("name"), then以另一种方式解决了我的问题.save()。一旦我这样做了,这一切都奏效了!


推荐阅读