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

3 投票
1 回答
2148 浏览
提问于 2025-04-17 12:39

在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"});

这样做可以扩展,并且利用了索引,所以性能会很好。


[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

撰写回答