通过PyMongo在find_one_and_update中使用文本搜索和排序

时间:2019-02-09 02:13:06

标签: mongodb pymongo

我已经创建了一些文本索引,并希望使用文本搜索来查找和更新特定文档(同时进行排序)。在this example中,他们向您展示了如何在按“ textScore”进行排序的同时查找特定文档,因此我将其转换为Python,如下所示:

db.stores.find(
    {"$text": {"$search": "java coffee shop"}},
    {"score": {"$meta": "textScore"}}
).sort([("score", {"$meta": "textScore"})])

,这很好。但是,我也想创建一个可以找到1个特定商店的函数,并使用$ set更新它。我尝试使用以下代码来做到这一点:

db.stores.find_one_and_update(
    {"$text": {"$search": search_string}},
    {"score": {"$meta": "textScore"}},
    {"$set": store_attributes},
    sort=[("score", {"$meta": "textScore"})]
)

看给定here的第四个示例,我认为这可以解决问题,但不幸的是,它给出了错误

ValueError: update only works with $ operators

当然,我可以使用回旋方式,例如将find()limit(1)一起使用,然后使用它来更新集合中的文档,但是我宁愿尝试这样做。我不确定自己在做什么错,在我看来这应该可行。

1 个答案:

答案 0 :(得分:0)

您会收到此错误,因为find_one_and_update的第二个参数是要执行的更新操作,而不是投影。因此,第二个参数应该是您的$set对象,而不是您的score投影。

但是,这并不重要,因为看来sort只能在文档的实际字段上完成,而不能像$meta这样的score字段完成。

所以我认为使用您提到的find().limit(1)方法是解决问题的方法。

也就是说,使用$text查询来更新文档确实有点不确定性,这可能就是为什么不直接支持它的原因。