所有这一切都在昨天工作,所以我真的不确定什么是错的。我在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));
答案 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 }
。