Python Eve嵌入式文档查询

时间:2016-10-10 03:14:50

标签: python mongodb eve

有没有办法在python eve中查询嵌入式文档? 例如:我有以下回应:
网址:http://127.0.0.1:5000/shipments/57fafd5bb9211367f5b2006e

{
    "_updated": "Mon, 10 Oct 2016 02:30:51 GMT",
    "track": "57fafd5bb9211367f5b2006d",
    "ref_no": "268771821909",
    "_created": "Mon, 10 Oct 2016 02:30:51 GMT",
    "_id": "57fafd5bb9211367f5b2006e",
    "_etag": "af5af366b7dba18456be6112c59172b1dfe21593"
}

以下是嵌入文档设置为1时的响应: 网址:http://127.0.0.1:5000/shipments/57fafd5bb9211367f5b2006e?embedded= {" track":1}

{
"_updated": "Mon, 10 Oct 2016 02:30:51 GMT",
"track": {
    "_updated": "Mon, 10 Oct 2016 02:37:57 GMT",
    "tracks": [
        {
        "status": "MS",
        "remark": "None",
        "datetime": "Mon, 10 Oct 2016 02:30:51 GMT"
        },
        {
        "status": "DP",
        "remark": "Not Good",
        "datetime": "Mon, 10 Oct 2016 02:31:51 GMT"
        }
        ],
    "_created": "Mon, 10 Oct 2016 02:30:51 GMT",
    "_id": "57fafd5bb9211367f5b2006d",
    "_etag": "9eac811c400d9c8a9507ae83988daeb5a5ec5c6c"
    },
"ref_no": "268771821909",
"_created": "Mon, 10 Oct 2016 02:30:51 GMT",
"_id": "57fafd5bb9211367f5b2006e",
"_etag": "af5af366b7dba18456be6112c59172b1dfe21593"
}

跟踪架构:

schema = {
    'awb_number' : {'type' : 'string'},
    'tracks'     : {'type':'list',
            'schema' : { 'type':'dict',
            'schema'   : {
            'status'   : {'type':'string', 'allowed': STATUS},
            'remark'   : {'type':'string', 'allowed': REMARK},
            'datetime' : {'type':'string'},
            }
        }
    }

}

现在我想查询status数组中最后一个元素的tracks。 Python中的类似内容:

if tracks[-1]['status'] == 'DP': print 'Do this'.

但我不确定如何在网址中查询相同内容。

2 个答案:

答案 0 :(得分:0)

  

我想查询tracks数组中最后一个元素的状态。 Python中这样的东西

在所有数据库交互和嵌入(如果有)之后,您需要获取所查询内容的响应。您可以通过添加event hook来实现。

您可以尝试类似

def do_something_with_result(resource, response):
    '''
       resource: contains who called (in your case, shipments probably)
       response: the data which you get back after the fetching
    '''

响应将是一个包含数据的字典,您可以在其中搜索track。现在,需要将此功能作为事件添加到当前的flask应用中。

from flask import current_app as app

app.on_fetched_item += do_something_with_result

请注意,这将在获取每个项目后触发。如果您想专门用于一种特定资源on_fetched_item_<resource_name>。然后,前一个函数的签名更改为do_something_with_result(response)

答案 1 :(得分:0)

我已经尝试过了,并且行得通。

client = MongoClient('localhost', 27017)
db = client['test']
collection = db["interests"]

r=collection.find({})
for data in r:
    for i in data['mylist']:
        if i['status']=='no':
           print("done")

我的兴趣模式如下:

interests={
'cache_control': 'max-age=10,must-revalidate',
'cache_expires': 10,
'schema':{
    'interest':{
        'type':'objectid',
        'required':True,
        'data_relation': {
            'resource': 'works',
            # make the owner embeddable with ?embedded={"owner":1}
            'embeddable': True
        },
    },
    'mylist':{
        'type':'list',
        'schema':{
            'type':'dict',
            'schema':{
                'myfield':{
                    'type':'string'
                },
                'status':{
                    'type':'string'
                }
            }
        }
    }
  }
}

希望这可以解决您的问题。