我正在抓取一组文本文档并构建一个json对象以使用python-lifter进行查询。我目前有像
这样的数据[
[
{name:dad},
{name:son, dob:2/24/2000}
],
[
{name:forever_alone, cats:12}
]
]
我想基于dob
键的存在做两个不同的查询:1)得到儿子和2)得到包含儿子(爸爸和儿子)的家庭。根据我的理解,升降机不能很好地支持字典列表。暂停一下这个问题,即升降机还不允许对不在每条记录上的字段进行查询,哪个更好,哪个更适合升降机?
字典词典列表?
[
{
0:{name:dad},
1:{name:son, dob:2/24/2000}
},
{
0:{name:forever_alone, cats:12}
}
]
还是字典列表字典?
{18283923:
[
{name:dad},
{name:son, dob:2/24/2000}
],
18283927:
[
{name:forever_alone, cats:12}
]
}
并且,给定一个理想的嵌套数据结构,两个查询将返回1)儿子和2)包含儿子的家庭?
答案 0 :(得分:1)
[免责声明:提升者维护者]
现在提升者不支持这种请求,因为提升者会尝试在每个对象上查找查询字段,如果该字段不存在则会引发错误。
目前对querying against iterable fields的支持也不是很好。
An issue已针对缺少的字段问题打开了, 但无论如何,您的数据结构并不适合此类查询。
更好的数据结构是:
families = [
{
'id': 1,
'members': [
{'name': 'dad'},
{'name': 'son', 'dob':'2/24/2000'}
]
},
{
'id': 2,
'members': [
{'name': 'forever_alone', 'cats': 12}
]
}
]
然后,在解决了之前的链接问题之后,您可以使用以下内容进行查询:
Family = lifter.models.Model('Family')
manager = Family.load(families)
# get families with son/dob members
son_dob_families = manager.filter(Family.members.name == 'son', Family.members.dob.exists())\
.values(Family.id, Family.members)
# keep only son members with dob
Member = lifter.models.Model('Member')
members = [member for family in son_dob_families for member in family['members']]
sons_with_dob = Member.load(members).filter(Member.name == 'son', Member.dob.exists())
这是一个理论上的API,但它还没有实现。