我的网络应用程序只包含一个主题列表和一个用于过滤它们的搜索字段。
我首先将对象插入MongoDB
:
$meteor mongo
meteor:PRIMARY> db.topics.insert({title:"Hello World!"});
我在我的.coffee
文件中写了这个,以验证它是否按预期显示:
topics = new Mongo.Collection "topics"
if Meteor.isClient
Template.body.helpers {
topics: -> topics.find {}
}
工作得很好。所以我决定采用"Hello"
的固定过滤器。我将topics.find {}
替换为:
topics.find {$text: {$search: "Hello"}}
这导致我的列表显示为空。我也试过这个:
topics.find {title: {$text: {$search: "Hello"}}}
但那也行不通。我在这里缺少什么?
(另外,这是我第一次使用CoffeeScript
。生成的JavaScript
文件对我来说是正确的,但如果您在此处看到任何不必要的标点符号或其他不良习惯,请指出作为一个倾向于帮助Python程序员的人,我知道对于那些不熟悉该语言的人来说,用不必要的分号乱扔它是多么令人讨厌。)
更新
我已根据Blakes Seven in his answer的指示添加了以下服务器代码:
if Meteor.isServer
Meteor.startup -> topics._ensureIndex {title: "text"}
如果我从命令行查询MongoDB
,如下所示,它可以正常工作:
$meteor mongo
meteor:PRIMARY> db.topics.find({$text: {$search: "Hello"}})
{ "_id" : ObjectId("559495cf7b8f68a693d8a3a8"), "title" : "Hello World!" }
但是,在我的应用程序中,在客户端代码中,topics.find {$text: {$search: "Hello"}}
仍无效。
更新2
Blakes Seven希望看到这一点:
$meteor mongo
meteor:PRIMARY> db.topics.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "meteor.topics"
},
{
"v" : 1,
"key" : {
"_fts" : "text",
"_ftsx" : 1
},
"name" : "title_text",
"ns" : "meteor.topics",
"safe" : true,
"weights" : {
"title" : 1
},
"default_language" : "english",
"language_override" : "language",
"textIndexVersion" : 2
}
]
答案 0 :(得分:0)
您需要在集合上创建"text index",然后才能执行$text
次搜索查询。
您可以创建此索引,以便Meteor.startup
下的server/indexes
部署为:
Meteor.startup(function() {
topics._ensureIndex({ "title": "text" })
]);
MongoDB 3.x系列推荐它的方法.createIndex()
,但目前的流星方法仍然像目前仍在调用.ensureIndex()
。
由于首选方法扩展了sytax以支持其他功能,因此这并不是一个令人担忧的问题。这些都不应成为普遍关注的问题。
如果您发现需要这些功能,您可以随时编写脚本" index"在Meteor应用程序代码之外部署。
正如旁注一样,在"单数"中引用集合模型是一般惯例。而不是"复数"形式,因为集合本身是"复数"而不是模特。一般的惯例是资本"第一。