MongoDB索引搜索在控制台中运行,但不在浏览器中运行

时间:2017-06-22 20:32:46

标签: javascript node.js mongodb indexing mongoose

所有这一切都在昨天工作,所以我真的不确定什么是错的。我在SO上搜索过并经历了多次文档和步骤,但我还是让它发挥作用。任何帮助都一如既往地赞赏!

如果我在shell中输入db.movies.find({ '$text': { '$search': 'elephant' } }),它会返回一个带有' elephant'的标题列表。在标题中。但是,如果我从浏览器运行相同的搜索,它会崩溃节点服务器,我会得到MongoError: text index required for $text query

错误来自find()

的错误响应
Movie.find(
  { '$text': { '$search': 'elephants' } },
  (err, movies) => {
    if (err) throw err; // MongoError: text index required for $text query
    if (!movies) {
      res.json({
        data: null,
        success: false,
        message: 'No movies data'
      });
    } else {
      res.json({
        success: true,
        data: movies
      });
    }
  })

我的数据库上的索引如下所示:

{
        "v" : 2,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "title_text",
        "ns" : "db.movies",
        "weights" : {
            "title" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
    }

我还定义了mongoose模式,并且我使用自动增量插件在每次保存电影时增加自定义id字段。 (保存电影有效,所以我连接数据库确定)

  mongoose.model('Job', new Schema({
    id: Number,
    title: String,
    desc: String,
    genre: String
  })
  .index({ title: 'text' })
  .plugin(autoIncrement.mongoosePlugin));

1 个答案:

答案 0 :(得分:0)

正如@Chris Satchell的评论所指出的那样 将索引添加到mongoose模式可以解决这个问题。

而不是:

mongoose.model('Job', new Schema({
    id: Number,
    title: String,
    desc: String,
    genre: String
  })

这样做:

mongoose.model('Job', new Schema({
    id: Number,
    title: { type: String, text: true },
    desc: String,
    genre: String
  })

即使我在Schema上仍然有.index({ title: 'text' }),您仍然需要在属性上定义{ type: String, text: true }