可以在pymongo中使用"javascript"查询的"find"方法吗?
在Mongo中,下面的写法是可以的:
> db.posts.find("this.text.indexOf('Hello') > 0")
但是在使用pymongo时,当执行下面的代码:
for post in db.posts.find("this.text.indexOf('Hello') > 0"):
print post['text']
就会出现错误。
我觉得在这个例子中,使用Mongo的全文搜索会更好,但在pymongo中,是否可以用“find”方法结合“javascript”查询呢?
1 个回答
6
你说得对 - 这可以通过服务器端的JavaScript来实现,使用 $where 条件[1]:
db.posts.find({"$where": "this.text.indexOf('Hello') > 0"})
这种方法在大多数情况下都能用,但在分片设置下就不行了,因为这样做的成本太高,因为你需要检查集合中的所有文档,所以一般不推荐这样做。
你也可以使用正则表达式搜索:
db.posts.find({'text':{'$regex':'Hello'}})
不过这也会对整个集合进行扫描,因为正则表达式没有固定起点(如果你给正则表达式加上固定起点,比如检查某个字段是否以某个值开头,并且这个字段有索引的话,你就可以利用这个索引)。
鉴于这两种方法都很耗费资源,性能和扩展性都不好,那么最好的方法是什么呢?
其实你给的链接中提到的全文搜索方法效果很好。你可以创建一个 _keywords 字段,把关键词以小写形式存储在一个数组中,然后对这个字段建立索引,这样你就可以像这样查询:
db.posts.find({"_keywords": {"$in": "hello"});
这样做可以扩展,并且利用了索引,所以性能会很好。
[2] http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo