【问题标题】:How to pass exact match word using pymongo to mongodb query?如何使用 pymongo 将精确匹配词传递给 mongodb 查询?
【发布时间】:2019-12-25 06:36:16
【问题描述】:

我正在尝试根据 mongodb 网站上提供的文档传递“完全匹配”的字符串。

见: https://docs.mongodb.com/manual/reference/operator/query/text/#phrases)

他们将令牌模式描述为"\"word\"",但我无法用 python 传递它,因为 '\' 被转义了......如何修复?

这些似乎都不起作用:


>>> x='\'word\''
>>> x
"'word'"

>>> x='\"word\"'
>>> x
'"word"'

>>> x='\\"word\\"'
>>> x
'\\"word\\"'

>>> x=r'\"word\"
>>> x
'\\"word\\"'

>>> x=r"\"word\""
'\\"word\\"'

#mongo query
query=mycol.find({"$match": {"$text": { "$search": x }}).limit(10)
return json.loads(dumps(query))

我希望搜索字符串 x 以 "\"word\"" 的形式传递给查询。

【问题讨论】:

    标签: python mongodb full-text-search pymongo


    【解决方案1】:

    所以,我对此进行了进一步调查,但我认为 PyMongo 不支持这种格式进行精确搜索。我在PyMongo's documents 或其他在线文档中找不到任何示例。但是,我确实在 MongoDb's site 上找到了 exact-search 的文档。

    我认为令人困惑的是,MongoDb 确实支持"\"word\"",但PyMongo's collection.find() 似乎不。我发现,PyMonogo 的 find() 方法的每个示例都使用"word" 的标准格式。

    PyMongo 的 find() 方法通过创建 PyMongo cursor 来工作。我不相信这个游标的构造支持"\"word\""的格式。我怀疑这就是为什么x 在传入 find() 之前可以等于"\"word\"",但在查询后返回为"\\"word\\""。我进一步怀疑 find() 已经在寻找完全匹配,这就是为什么要添加额外的 \s。 测试代码:

    from pymongo import MongoClient
    import json
    
    client = MongoClient()
    db = client.test_database
    mycol = db.test_collection
    
    x = r""""\"word\""""
    x += r"""" """
    x[:-1]
    
    print(x)
    myquery = mycol.find({"$match": {"$text": { "$search": f'{x}' }}}).limit(10)
    print(myquery)
    

    如果您找到了解决方案,请告诉我。

    【讨论】:

    • 嗨马修,感谢您的回复。恐怕字符串 x 在查询中仍会解析为 '"\\"word\\"" '。但是 print 语句的 eval 是正确的。
    【解决方案2】:

    以下代码可让我在我的 MongoDB 3.4 实例上找到完全匹配:

    coll.find({"$text":{"$search":'\"exact phrase\"'}})
    

    它匹配“exact phrase”,但不匹配“exact other phrase”。但是,它也会匹配“精确短语”,因为在正则表达式中似乎没有单词边界字符“\b”。

    这只有在你有 $text index set up properly 时才有效

    您可能会发现更好的解决方案是using regular expression in pymongo

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-03-02
      • 2023-04-09
      相关资源
      最近更新 更多