Mongo Robot Framework的db扩展库returns错误记录

Mongo Db extended library for Robot Framework returns wrong records

我已经扩展了用于机器人框架的 MongoDbLibrary,以便可以使用 .skip()、.take() 和 .order()

def _retrieve_mongodb_records_ex(self, dbName, dbCollName, recordJSON, sorting, skip=0, take=None, fields=[], returnDocuments=False):
    db = None
    try:
        dbName = str(dbName)
        dbCollName = str(dbCollName)
        criteria = dict(json.loads(recordJSON))
        db = self._dbconnection['%s' % (dbName,)]
        coll = db['%s' % (dbCollName)]
        if fields:
            results = coll.find(criteria, fields)
        else:
            results = coll.find(criteria)
        if sorting:
            results = results.sort(sorting)
        if (skip):
            skip = int(skip)
        if skip > 0:
            results = results.skip(skip)
        if take:
            results = results.limit(int(take))
        if returnDocuments:
            return list(results)
        else:
            response = ''
            for d in results:
                response = '%s%s' % (response, d.items())
            return response
    finally :
        if db :
            self._dbconnection.end_request()

我在 python 上进行了测试:

mongo.connect_to_mongodb("mongodb://somehost", 27017)
result = mongo.retrieve_some_records("MMMongoDB", "importjob", "{\"Status\" : 9}", [("DateCreated", -1)], "0", "1", True)

本次测试returns数据正确

在机器人框架中,我在我的关键字中使用了这个方法:

Get Some Mongo Records With Order And Limit
[Arguments]    ${MongoHostProp}    ${MongoPortProp}    ${MongoDbNameProp}    ${MongoCollProp}    ${QueryProp}    ${Sorting}
...    ${Skip}    ${Take}
Connect To MongoDB    ${MongoHostProp}    ${MongoPortProp}
${records}=    Retrieve Some Records    ${VAR_ImportMongoDbName}    ${VAR_ImportJobMongoCollName}    ${QueryProp}    ${Sorting}    ${Skip}
...    ${Take}    true
Disconnect From Mongodb
[Return]    ${records}

但是这个关键字 returns 与 ${QueryProp} 匹配的第一个项目忽略了 ${Sorting}。

我比较了我发送给这个 python 方法的参数 - 它们是相等的。有谁知道问题出在哪里?

我认为 pymongo 不将排序参数视为键值对的原因是 RobotFramework 倾向于将每个值都转换为字符串。

您的 Python 代码应检查该值是否为字符串并对其求值以将其转回键值对列表。

    if isinstance(sorting, string_types):
                    sorting = eval(sorting)

Pymongo 将字符串解释为单个排序键,并通过添加 'pymongo.ASCENDING'(默认方向)将其变成对。