【问题标题】:Performing regex queries with PyMongo issue使用 PyMongo 问题执行正则表达式查询
【发布时间】:2023-03-14 12:06:01
【问题描述】:

我正在尝试使用 PyMongo 对 MongoDB 服务器执行正则表达式查询。文档结构如下。

{
    "_id" : ObjectId("6076d2598128b279dfd62b1d"),
    "transactionId" : "Test_Operation_112",
    "requestA" : {
            "pState" : "{\"key1\":\"value1\",\"key2\":\"value2\"}",
            "request" : "{\"header\":{\"sender\":{\"login\":\"XXXXXXXXXX\",\"password\":\"XXXXXXXXXX\"},\"notification\":{\"url\":\"https://example.com/pqr\"},\"transactionId\":\"Test_Operation_112\",\"timeStamp\":\"04/13/2021 12:30:25-07:00\"},\"order\":{\"action\":\"CANCEL\"}]}}}"
    },
    "requestTimeStamp" : "04/13/2021 12:30:25-07:00",
    "responsesA" : {
            "response" : "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><Response System='HGGH' xsi:noNamespaceSchemaLocation='Response.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><Header TransactionId='Test_Operation_112'  TimeStamp='04/13/2021 12:30:25-07:00'><Sender Login='XXXXXXXXXX' Password='XXXXXXXXXX'/><Notification URL='https://example.com/pqr'/><TransactionCode MajorCode='0' Description='Success'><TransactionCodeList ErrorCode='0' ErrorMessageText='Service Removed'/></Response>"
    },
    "lastUpdatedTime" : ISODate("2021-04-14T11:30:33.605Z")
}

{
    "_id" : ObjectId("6076d2598128b279dfd62b1d"),
    "transactionId" : "XYZ123123_7_Test$a1b2c3",
    "requestA" : {
            "pState" : "{\"key1\":\"value1\",\"key2\":\"value2\"}",
            "request" : "{\"header\":{\"sender\":{\"login\":\"XXXXXXXXXX\",\"password\":\"XXXXXXXXXX\"},\"notification\":{\"url\":\"https://example.com/pqr\"},\"transactionId\":\"XYZ123123_7_Test$a1b2c3\",\"timeStamp\":\"04/13/2021 12:30:25-07:00\"},\"order\":{\"action\":\"CANCEL\"}]}}}"
    },
    "requestTimeStamp" : "04/13/2021 12:30:30-07:00",
    "responsesA" : {
            "response" : "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><Response System='HGGH' xsi:noNamespaceSchemaLocation='Response.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><Header TransactionId='XYZ123123_7_Test$a1b2c3'  TimeStamp='04/13/2021 12:30:25-07:00'><Sender Login='XXXXXXXXXX' Password='XXXXXXXXXX'/><Notification URL='https://example.com/pqr'/><TransactionCode MajorCode='0' Description='Success'><TransactionCodeList ErrorCode='0' ErrorMessageText='Service Removed'/></Response>"
    },
    "lastUpdatedTime" : ISODate("2021-04-14T11:30:33.605Z")
}

有不同类型的交易 ID。我想获取与事务 ID 模式匹配的所有记录。正则表达式模式是正确的。我尝试这样做

db.collectionName.find({"$and": [
{"requestTimeStamp": {"$gte": '04/13/2021 00:00:00-00:00', "$lte": '04/13/2021 23:59:59-00:00'}},
{"responsesA.response": {"$regex":  "ErrorCode='0'"}},
{"requestA.request": {"$regex": "CANCEL"}}, 
{ "transactionId": { "$in": [/^Test_Operation_\d*/, /^XYZ\d*_\d_Test\$\S*/] } }]});

但我什么也没得到。我是否遗漏了什么,因为根据 MongoDB 文档,这应该是可能的?如果我在 Mongo 控制台中执行查询,它工作正常,这是否意味着 API 不支持它或者我只是使用不正确?

【问题讨论】:

  • requestTimeStamp - 这个字段的数据类型是什么?
  • requestTimeStamp 的类型为 string。如果我删除下面的部分,那么查询也会在 python 中成功执行。 { "transactionId": { "$in": [/^Test_Operation_\d*/, /^XYZ\d*_\d_Test\$\S*/] } }

标签: mongodb pymongo


【解决方案1】:

几件事。 find() 返回一个游标;您必须对其进行迭代才能获得结果。您不需要$and 部分,因为默认情况下查询是anded。您的正则表达式可以简化(参见代码)。

把它放在一起:

cursor = db.collectionName.find(
    {"requestTimeStamp": {"$gte": '04/13/2021 00:00:00-00:00', "$lte": '04/13/2021 23:59:59-00:00'},
     "responsesA.response": {"$regex": "ErrorCode='0'"},
     "requestA.request": {"$regex": "CANCEL"},
     "transactionId": {'$regex': '^Test_Operation_\d*|^XYZ\d*_\d_Test\$\S*'}})

print(list(cursor))

【讨论】:

  • 谢谢@BellyBuster
猜你喜欢
  • 2011-03-29
  • 2020-10-26
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多