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

sat*_*oto 3 python mongodb pymongo

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

> db.posts.find("this.text.indexOf('Hello') > 0")
Run Code Online (Sandbox Code Playgroud)

但是使用pymongo时,执行以下操作时:

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

发生了错误.

我认为Mongo中的全文搜索在这个例子中是更好的方法,但是可以使用"查找"方法和pymongo的"javascript"查询吗?

Ros*_*oss 6

你是对的 - 你使用$ where子句[1]通过服务器端javascript执行此操作:

db.posts.find({"$where": "this.text.indexOf('Hello') > 0"})
Run Code Online (Sandbox Code Playgroud)

除了分片设置之外,它们都可以工作,但是由于您将检查集合中的所有文档,因此执行成本被认为是令人望而却步的,这就是为什么它通常不被认为是一个好主意.

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

db.posts.find({'text':{'$regex':'Hello'}})
Run Code Online (Sandbox Code Playgroud)

这也将执行完整的集合扫描,因为正则表达式未锚定(例如,如果您锚定正则表达式,例如,您正在检查字段是否以值开头并且在该字段上具有索引,则可以使用索引).

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

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

db.posts.find({"_keywords": {"$in": "hello"});
Run Code Online (Sandbox Code Playgroud)

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


[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