使用Nodejs在mongo db中获取过滤/搜索文本的空数组

时间:2017-04-27 12:51:01

标签: javascript node.js mongodb

我正在尝试使用节点js.my结果数组的mongo数据库中的搜索功能始终为空。我在这里分享了我的代码。有人帮我找错了。 搜索后我在控制台中得到一个空数组[。]

模型/ contact.js

var mongoose = require('mongoose');
var ContactSchema = new mongoose.Schema({
cid: String,
name: {type: String, index: true},
phon: Number,
contactwith:  {type: String, index: true}
 });
 module.exports = mongoose.model('Contact', ContactSchema);


   mongoose.model('Contact', ContactSchema).ensureIndexes(function(err) {
      if (err)
          console.log(err);
       else
          console.log('create contact index successfully');
     });

控制器/ contact.js

 var mongoose = require('mongoose');
 var Contact = mongoose.model('Contact');

  var ContactController = function(app,mongoose){   
    app.post('/search',function(req,res){
    var query = req.body.searchbx;
    console.log(query);
    var dbsearch = Contact.find({$text: {$search: query}}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}});
    console.log(dbsearch);

    Contact.find({$text: {$search: query }}, function (err, results){
        if(err){
            console.log(err);
        }
        if(results){
            console.log('in results')
            console.log(results)
            res.render("search",{results: results});
        }
    })

  });
 }
module.exports = ContactController;

在玉器文件中

form(id="search-filter" method ="POST" action="/search")
input#search-bx(type='text', name='searchbx' placeholder="search here")
input(type="submit", value="Search")

1 个答案:

答案 0 :(得分:0)

我希望你是nodeJS的初学者。欢迎:))

除了两件重要的事情外,你做了很多事情!

  1. 您已使用POST方法进行搜索操作。根据HTTP标准,您必须使用GET或PATCH进行搜索相关操作
  2. 请阅读: http://restfulapi.net/http-methods/

    1. 您已尝试进行文字搜索。 $ text查询工作,mongodb需要使用文本索引索引字段。 你想在你的猫鼬中做一些改变

      {fields:{type:[String],text:true}

    2. REF: https://docs.mongodb.com/v3.2/core/index-text/

      这是简单而干净的代码: 你可以根据样本进行修改

      var mongoose = require('mongoose');
      module.exports = mongoose.model('Todo', {
          name : {type : String, unique: true,  text: true},
          location: {type: String}
      });
      
      Controller:
      app.get('/api/todo/search/:searchKey', function (req, res) {
              var searchKey = req.params.searchKey;
              if (!searchKey) {
                  return res.send({ reason: 'searchKey required' });
              }
              Todo.find({
                  $text: { $search: searchKey }}, function(err, result) {
                      if (err) {
                          res.status(500);
                          return res.send({ reason: err.toString() });
                      } else if (result && result.reason) {
                          return res.status(400).send(result);
                      }
                      return res.status(200).send(result);
                  });
          });
      

      一切顺利!