您只是忘记了JSON路径也应该包括最外面的数组:
User.query.filter(User.contact_list.contains([{"phone": ["147889"]}])).all()将返回您正在寻找的用户。如果您的JSON包含带有键“
phone”等的对象,则原始查询将匹配。请注意,这将返回所讨论的
User对象,而不是JSON结构中的特定对象/名称。如果您希望这样做(这似乎是最终目标),则可以扩展每个用户的数组元素,根据结果记录进行过滤,然后选择名称:
val = db.column('value', type_=JSONB)db.session.query(val['name'].astext). select_from(User, db.func.jsonb_array_elements(User.contact_list).alias()). filter(val.contains({"phone": ["147889"]})). all()另一方面,上述查询的索引友好性不如第一个查询,因为它必须在过滤之前扩展所有数组,因此最好先在联系人列表中找到包含电话的用户,子查询或CTE,然后展开和过滤。



