为了账号安全,请及时绑定邮箱和手机立即绑定

如何在nodejs和mongodb中制作搜索api

如何在nodejs和mongodb中制作搜索api

HUX布斯 2021-08-20 19:32:32
我正在尝试使用 nodejs 和 MongoDB 制作搜索 api。我试图用谷歌搜索这个,我确实在那里找到了一些东西,但是在尝试实施时我得到一个错误提示。老实说,我不知道如何解决这个问题,我对制作搜索 API 一无所知。所以任何帮助或建议都会对我有所帮助。这是我在 google Building a simple search api上找到的帖子的链接。错误{    "error": {        "message": "Cast to ObjectId failed for value \"search\" at path \"_id\" for model \"Post\"",        "name": "CastError",        "stringValue": "\"search\"",        "kind": "ObjectId",        "value": "search",        "path": "_id"    }}这是我的代码postController.search = (req, res) => {    var response = [];    if(typeof req.query.title !== 'undefined'){        db.Post.filter(function(post) {            if(post.title === req.query.title){                console.log(req.body);                response.push(post);                console.log(post);            }        });    }    response = _.uniqBy(response, '_id');    if(Object.key(req.query).length === 0){        response = db.Post    }    res.json(response);};集合中的数据"data": [    {        "isDeleted": false,        "_comments": [],        "_id": "5d39122036117d2ea81b434c",        "title": "facebook  post",        "link": "facebook.com",        "_creator": {            "createdAt": "2019-07-25T01:42:21.252Z",            "username": "adityakmr"        },        "createdAt": "2019-07-25T02:21:20.634Z",        "__v": 0    },]
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

如果您正在尝试创建一个 API 来根据标题搜索 mongoDB 集合,即;文本字段尝试实现 mongoDB 的文本搜索功能:在 mongoDB 中进行文本搜索 ,只需在标题字段上创建一个文本索引,然后使用 post 方法创建一个 API,该 API 接受可以针对标题字段查询的参数。

文本搜索可能有点棘手,它可以帮助您进行模糊/部分/全文搜索 - 使用正则表达式也非常有益。


查看完整回答
反对 回复 2021-08-20
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

首先,您需要async/await用于模块化您的代码。我建议不要在你的controller.js文件中写你的全部代码,API 可以按照(路由 - 控制器 - utils)的方式制作。


postRoutes.js


 postRouter.get('/search-post', postCtr.searchPost);

postController.js


const postUtils = require('./postUtils');


const postController = {};


postController.searchPost = async (req, res) => {

  try {

    const { title } = req.query;

    const result = await postUtils.searchPost(title);

    return res.status(200).json(result);

  } catch (err) {

    return res.status(err.code).json({ error: err.error });

  }

};


module.exports = postController;

postUtils.js


const Post = require('./postModel');


const postUtils = {};


postUtils.searchPost = async (title) => {

  try {

    let result = [];

    if(title){

      // Even you can perform regex in your search 

      result = await Post.find({ title: title });

    }

     return result;

  } catch (err) {

    const errorObj = { code: 500, error: 'Internal server error' }; // It can be dynamic

    throw errorObj;

  }

};


module.exports = postUtils;


postModel.js


const mongoose = require('mongoose');


const postSchema = new mongoose.Schema({

  user: {

    type: mongoose.Schema.Types.ObjectId,

    ref: 'user',

    required: true,

  },

  // Your fields ...

}, { collection: 'post', timestamps: true });


const post = mongoose.model('post', postSchema);


module.exports = post;


使用这种结构,您可以轻松调试代码,而且它也易于管理。


查看完整回答
反对 回复 2021-08-20
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

在您上面指定的链接中,他们使用存储在名为 的文件中的对象数组store.js,但不是 mongoDB。因此,他们直接使用Array.filter方法进行过滤。


但是在使用 mongoose(对象建模工具)的 mongoDB 中,您可以使用collection.find()方法。


所以你的问题的解决方案如下


postController.search = async (req, res) => {

    var response = [];

    if (req.query.title) {

         response = await db.Post.find({title: req.query.title});

    }

    res.json(response);

 };

find 是内置的查询方法,有助于查询集合,您可以传递多个属性进行查询。


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信