python-3.x 如何在TinyDB中查询特定的键?

58wvjzkj  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(109)

你好,我想通过TinyDB获得一个特定的密钥,但我只得到一个空的结果。
下面是我的db的一个简单例子:

{"_default": {
  "1": {
    "1082685467876675736": "https://stackoverflow.com/"
  }
}}

字符串
在这里,我试图获取特定pid的url(在本例中是https://stackoverflow.com/):

db = TinyDB('db.json')
pid = 1082685467876675736
url= db.get(Query()[str(pid)])
print(url)


这将返回一个空结果。请注意:我从来不知道URL。所有的查询是pid。
我会感激任何帮助:)

k4emjkb1

k4emjkb11#

您要完成的是通过键名查找一个条目。但是数据库中的查询主要是为了查找特定键上的值而构建的。
我想你有两个选择

1.重新设计数据库模式

如果pid是你要查询的重要值,不要将它存储为键,而是将它存储为值;就像这样:

{"_default": {
  "1": {
    "pid": "1082685467876675736",
    "url": "https://stackoverflow.com/"
  },
  "2": {
    # ...
  }
}}

字符串
然后,您可以使用以下命令轻松查询此文档:

db = TinyDB('db.json')
pid = 1082685467876675736
result = db.search( Query().pid == str(pid) )
print( result.get('url') )

2.使用exists()查询

由于NoSQL数据库的性质,并不是每个文档看起来都一样。您可以随时从某些文档中添加或删除密钥。也就是说,可能需要选择具有(或不具有)特定密钥文档子集。

作为一个例子考虑一个带有博客文章的数据库。其中一些有注解(所以文档在键comments下得到了注解列表)。如果你对带有评论的帖子感兴趣,你可以查询它们,而不管comments键的内容(这是非常有用的)。

在您的示例中,这个pid可能不会将您的数据分组。我想这是每个文件都有不同和存在的价值。因此,exists()不是本文的目的,也远非最佳实践。
但是,无论如何,这都应该工作:

db = TinyDB('db.json')
pid = 1082685467876675736
result = db.search( Query()[ str(pid) ].exists() )
print( result.get( str(pid) ) )

相关问题