使用[python-lifter]

时间:2016-02-25 16:58:26

标签: python nosql

我正在抓取一组文本文档并构建一个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)包含儿子的家庭?

1 个答案:

答案 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,但它还没有实现。