在 v2 中,可以使用查询fileId in children
调用 /files
以获取作为所提供文件的父级的DriveFile
对象的列表。
现在,似乎需要调用/files/:fileId?fields=parents
,然后为每个返回的父级单独调用/files/:parentId
,可能会将一个调用变成十几个。
这是正确的吗,如果是,为什么?这对我们的应用程序来说是一个巨大的性能打击,所以希望有一个未记录的方法。
查询"'fileId'in child'"在 v2 中也不公开存在(未记录/支持),我不记得它曾经存在过。V2 中存在的是 Parents 集合,它有效地回答了相同的问题。在 v3 中,要获取文件的父项,您只需获取子项并请求父项字段。
至于这是否是性能打击,我认为在实践中不是。v2 中的父级资源一开始就非常轻巧,除了 ID 之外,唯一有用的字段是"isRoot"属性。您可以通过预先调用 files/root 来计算自己,以获取该用户的根文件夹的 ID(只需一次并保存它,它不会为该用户更改。
如果您需要获取有关父级的更多信息,而不仅仅是 ID,并且担心您必须进行的 # 次调用,请使用批处理来获取它们。如果您只有一个父级,则无需批处理(这只是开销。如果发现文件有多个父文件,请创建批处理请求。这将作为单个HTTP请求/响应发送,并在后端非常有效地处理。
关键是,如果你只需要身份证,它不会比以前差。只需一次调用即可获取文件的父项。
如果您需要的不仅仅是 ID,则最多需要 2 个 HTTP 请求(除了非常奇怪的边缘情况,例如 1000+ 父级,这将超过批量大小:)
在 V3 中,可以列出父级的所有子项,如下所示:https://developers.google.com/drive/v3/web/search-parameters
调用示例: https://www.googleapis.com/drive/v3/files?q=parents in '0Byho0qAdzabmVl8xcDR1S0pNY3c'
当然用%20
替换空格,这将列出文件夹中具有id='0Byho0qAdzabmVl8xcDR1S0pNY3c'
你只需要像下面这样提一下:
var request = service.Files.List();
request.Q = "('root' in parents)";
var FileListOfParentOnly = request.Execute();
编辑:好吧,我没有彻底阅读原文,似乎他们试图做一些与我不同的事情。我正在尝试以尽可能少的请求递归驱动器文件,所以我想获取所有级别 1-2-3...单个请求中的文件夹内容。这是可能的。
我在谷歌错误跟踪器上发布了这个,但我也会在这里发布它。
该 API 很笨重,但它可以工作。要从共享云端硬盘中获取云端硬盘,您必须将"语料库"设置为"云端硬盘"、"driveId"和"includeItemsFromAllDrives"为 true。要从"我的云端硬盘"抓取,您需要在"q"查询中"所有者中的'我'",对于与我共享,您需要在所有者中"而不是所有者中的'我'"。
然后,您将父 id 与 eg: 连接起来:
if (folderIds.length > 0) {
params.q = `${params.q} and ('${folderIds.join("' in parents or '",)}' in parents)`;
}
结果将是一个大屁股字符串,但它应该有效。可能在某些情况下,由于搜索参数太长,它可能会产生 431,但到目前为止还不错。