【问题标题】:TinyDB get all IDs in list queryTinyDB获取列表查询中的所有ID
【发布时间】:2016-12-26 02:09:02
【问题描述】:

我在我的 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

【问题讨论】:

    标签: python json tinydb nosql


    【解决方案1】:

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

    .any 可能会起作用

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

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

    【讨论】:

    • 感谢您的帮助,但这似乎也不起作用。这非常奇怪,因为它应该能够接受文档:tinydb.readthedocs.io/en/latest/usage.html
    • 请查看高级查询部分tinydb.readthedocs.io/en/latest/usage.html#advanced-queries。它说该字段必须是一个列表。
    • 我可能解释不正确,但它说用户可能是查询中的管理员或用户。所以它应该能够检索与该查询匹配的所有组类型
    • 在回顾部分,它声明: Query().field.all(query | list) 如果给定一个查询,则匹配列表字段中的所有元素与查询匹配的所有元素。如果给定一个列表,则匹配列表字段中的所有元素都是给定列表成员的所有元素 Query().field.any(query | list) 如果给定一个查询,则匹配列表中至少有一个元素的所有元素字段匹配查询。如果给定一个列表,则匹配列表字段中至少一个元素是给定列表成员的所有元素
    • 另外该字段必须是一个列表才能使用'all'或'any',这里的字段它只是整数。
    【解决方案2】:

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

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

    test() Matches any document for which the function returns True

    【讨论】:

      【解决方案3】:

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

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

      取自Query's 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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        • 2014-02-19
        相关资源
        最近更新 更多