mongodb - 使用 PyMongo 在 find_one_and_update 中使用文本搜索和排序

标签 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"})]
)

查看给定的第 4 个示例 here我认为这会起作用,但不幸的是它给出了错误

ValueError: update only works with $ operators

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

最佳答案

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

但是,这并不重要,因为 sort 似乎只能在文档的实际字段上完成,而不是像 这样的 $meta 字段得分

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

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

关于mongodb - 使用 PyMongo 在 find_one_and_update 中使用文本搜索和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602516/

相关文章:

ruby-on-rails - 是否可以只从 mongo 中的文档中检索唯一值?

javascript - MONGO_URL 用于在一台服务器上运行多个 Meteor 应用程序

python - 如何在 Mongoengine Python 中获取字典对象?

python - 如何在Flask中使用SubmitField的onclick函数(WTF SubmitField问题)

javascript - 如何比较数组并计算匹配项

java - 无法将带有连字符的 JSON 字段映射到 Java 对象字段

MongoDB - 十进制类型的值怎么样?

python - 使用 pymongo 插入嵌套字段时清理用户输入

Django pre-shutdown hook 关闭挂起的pymongo连接

python - Pymongo 聚合() $project