2

我在我的 python 项目中使用TinyDB 。但是,为了使逻辑有效,我需要能够在查询中获取多个对象。我的偏好是使用列表

listOfIDs = ['123', '456']

我正在使用最新的 Python 版本和 TinyDB 实现。

我有以下实现:

from tinydb import TinyDB, Query
db = TinyDB('db.json')
myDBQuery= Query()
db.insert({'id': '123', 'name': 'bob'})
db.insert({'id': '456', 'name': 'mary'})
result = db.search(myDBQuery.id.all(['123', '456']))
print(result)

但是,我不断得到以下结果:

[]

我知道我的实现正在运行,因为当我执行以下操作时,我得到了预期的结果:

result = db.search((myDBQuery.id == '123') | myDBQuery.id == '456'))

有人知道如何使用 TinyDB 中的列表进行查询吗?

有人知道如何使用 TinyDB 中的列表进行查询吗?

编辑

对于那些想知道的人,目前的实现没有办法做到这一点。我唯一的解决方法是创建类似以下的内容

def getAllObjectsMatchingId(listOfIds):

tempList = []

for idMember in tempList:
    result = db.search(myDBQuery.id == idMember)
    tempList.append(result)

return tempList
4

3 回答 3

2

.all仅当列表的所有元素都与查询匹配时才返回 true

.any可能会起作用

result = db.search(myDBQuery.id.any(['123', '456']))

从问题 OP编辑​​:请参阅我上面的编辑

于 2016-12-26T02:49:12.120 回答
0

这对我来说似乎是最好的解决方案:

db.search(myDBQuery.id.test(lambda x: x in listOfIDs))

test() 匹配函数返回 True 的任何文档

于 2020-07-02T03:09:30.183 回答
0

如果有人仍然遇到这个问题,Reinaldo 的实现的替代方案:

listOfIds = ['1','2','3']
q = Query()
db.search(q.id.one_of(listOfIds))

取自Query 的 API

one_of(items: List[Any]) → tinydb.queries.QueryInstance
    Check if the value is contained in a list or generator.

您还可以否定查询(这是我需要的)以获取不在列表中的项目:

listOfIds = ['4','5']
q = Query()
db.search(~q.id.one_of(listOfIds))
于 2020-07-22T19:28:17.660 回答