用pymongo的“javascript”查询可以使用“find”方法吗?

时间:2012-02-09 09:52:04

标签: python mongodb pymongo

使用Mongo,可以使用以下内容:

> db.posts.find("this.text.indexOf('Hello') > 0")

但是对于pymongo,执行以下操作时:

for post in db.posts.find("this.text.indexOf('Hello') > 0"):
    print post['text']

发生了错误。

我认为Full Text Search in Mongo在这个例子中是更好的方法,但是可以在pymongo中使用“find”方法和“javascript”查询吗?

1 个答案:

答案 0 :(得分:6)

你是对的 - 你可以使用$ where子句[1]:

在服务器端javascript中执行此操作
db.posts.find({"$where": "this.text.indexOf('Hello') > 0"})

除了分片设置之外,其他所有设置都可以使用,但由于您将检查集合中的所有文档,因此这样做的成本会被视为过高,这就是为什么它通常不被认为是一个好主意。

您还可以进行正则表达式搜索:

db.posts.find({'text':{'$regex':'Hello'}})

这也会进行完整的集合扫描,因为正则表达式没有被锚定(例如,如果您锚定正则表达式,请重新检查字段是否以值开始在该字段上有一个索引可以使用索引。)

鉴于这两种方法价格昂贵且不能很好地执行或扩展,那么最好的方法呢?

您提供的链接[2]中描述的全文搜索方法效果很好。创建一个_keywords字段,将关键字存储为数组中的小写,索引该字段,然后您可以这样查询:

db.posts.find({"_keywords": {"$in": "hello"});

这将扩展和利用一个索引,因此将具有高效性。


[1] http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

[2] http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo