【问题标题】:Using text search and sorting in find_one_and_update with PyMongo使用 PyMongo 在 find_one_and_update 中使用文本搜索和排序
【发布时间】:2019-07-03 07:00:39
【问题描述】:

我创建了一些文本索引,并希望使用文本搜索来查找和更新特定文档(同时也进行排序)。在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),然后使用它来更新集合中的文档,但我宁愿尝试这样做。我不确定我做错了什么,在我看来这应该可以。

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

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

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

    所以我认为使用你提到的find().limit(1) 方法是这里的方法。

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

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 2016-05-16
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多