所以我将Node.js与MongoDB一起用于我的Web应用程序。我在为模式创建文本索引和在数组中搜索文本时遇到了一些麻烦。我已经查看了mongo文档,但没有找到与此相关的任何内容。
我当前的实现在常规字符串值上成功搜索,但查询[String]中的文本匹配并不会返回任何内容。
这是我的REST电话:
...console.log("Query string: " + str);
var qry = {
"$text": {
"$search": str
}
};
model.find(qry, function (err, results) {...
当我创建我的架构时:
var blah = new Schema({
foo : String,
bar : [String],
...
blah.index({
foo: 'text',
bar: 'text'
});
任何查询都不会返回bar
中匹配的结果。 foo
内某些内容的查询字符串工作正常。
答案 0 :(得分:1)
仔细检查您是否在正确的集合上创建了正确的索引,并且正在向正确的集合发出查询。索引数组对我有用:
> db.test.drop()
> db.test.insert({ "_id" : 0, "a" : "dogs are good" })
> db.test.insert({ "_id" : 1, "a" : "I like dogs", "b" : ["where's my dog?", "here, have a cat"] })
> db.test.insert({ "_id" : 2, "b" : ["she borrowed my dog", "my frogs are croaking"] })
> db.test.ensureIndex({ "a" : "text", "b" : "text" })
> db.test.find({ "$text" : { "$search" : "dogs" } }, { "_id" : 1 })
{ "_id" : 0 }
{ "_id" : 2 }
{ "_id" : 1 }
答案 1 :(得分:0)
好的,我终于明白了!事实证明,grunt服务不会更新数据库中的索引。我只为“foo”创建了一个文本索引,并且在向索引添加“bar”时没有更新。我不得不跑 - 在mongo shell:
db.dropDatabase()
下次运行时,会重新创建数据库并设置正确的索引。如果其他人遇到此问题,请尝试运行db.getIndexes()
。