【问题标题】:Google Drive API search with "mimeType contains" query doesn't work correctly使用“mimeType contains”查询的 Google Drive API 搜索无法正常工作
【发布时间】:2020-01-21 17:29:11
【问题描述】:

我正在使用 Google Drive v3,我正在尝试获取与以下类别相关的所有文件:

  • 不是 Google 文档的文件(mime 类型不是从“application/vnd.google-apps”开始),例如“text/plain”、“image/bmp”等。
  • Google 电子表格(mime 类型为“application/vnd.google-apps.spreadsheet”)

我想通过单个请求获取所有这些文件。

可以通过以下子查询获取第一类文件: not mimeType contains 'application/vnd.google-apps.'

第二类子查询:mimeType = 'application/vnd.google-apps.spreadsheet'

因此,我将这些部分与 or 运算符结合起来,然后查询父文件夹 ID: '<parentId>' in parents and (mimeType = 'application/vnd.google-apps.spreadsheet' or not mimeType contains 'application/vnd.google-apps.')

但它不起作用。它仅返回 Google 电子表格文件。 我尝试分别对两个文件类别执行查询,它们工作正常:

'<parentId>' in parents and (mimeType = 'application/vnd.google-apps.spreadsheet') 返回所有 Google 电子表格

'<parentId>' in parents and (not mimeType contains 'application/vnd.google-apps.') 返回所有非 Google Drive 格式。 `

作为实验,我检查了另一个案例(有点简化):

  • mimeType = 'application/vnd.google-apps.spreadsheet' or mimeType = 'text/plain' - 返回电子表格+文本,正确
  • mimeType = 'application/vnd.google-apps.spreadsheet' or mimeType contains 'text/plain' - 仅返回电子表格,不正确
  • mimeType = 'application/vnd.google-apps.spreadsheet' or not mimeType = 'text/plain' - 仅返回电子表格,不正确(我的文件夹中也有图片)
  • mimeType contains 'text/plain' - 返回文本,正确

我的部分文件请求代码(当然,已替换 parentId):

Drive.Files.List filesRequest = service
      .files()
      .list()
      .setFields("files(id, name)")
      .setQ("'<parentId>' in parents " +
              "and (mimeType = 'application/vnd.google-apps.spreadsheet' " +
                "or not mimeType contains 'application/vnd.google-apps.')");
    FileList result = filesRequest.execute();
    List<File> files = result.getFiles();

使用的依赖版本:google-api-services-drive 从 v3-rev162-1.23.0 到 v3-rev173-1.25.0,JDK 1.8.0-91。

请帮忙。

【问题讨论】:

    标签: java google-drive-api


    【解决方案1】:
    • 您想要检索除 Google 相关文件之外的所有文件,Google 电子表格除外。

      • 不是 Google 文档的文件(mime 类型不是从“application/vnd.google-apps”开始),例如“text/plain”、“image/bmp”等。
      • Google 电子表格(mime 类型为“application/vnd.google-apps.spreadsheet”)
    • 您希望通过一个搜索查询的单个请求来实现这一目标。

    如果我的理解是正确的,那么这个查询呢?请认为这只是几个答案之一。

    根据您的情况和测试的示例查询,忽略除application/vnd.google-apps.spreadsheet 之外的所有 Google 文档 mimeTypes 的查询如何? Google 相关文件的所有 mimeTypes 都可以在here 看到。

    示例搜索查询:

    '<parentId>' in parents and (mimeType!='application/vnd.google-apps.audio' and mimeType!='application/vnd.google-apps.document' and mimeType!='application/vnd.google-apps.drawing' and mimeType!='application/vnd.google-apps.file' and mimeType!='application/vnd.google-apps.folder' and mimeType!='application/vnd.google-apps.form' and mimeType!='application/vnd.google-apps.fusiontable' and mimeType!='application/vnd.google-apps.map' and mimeType!='application/vnd.google-apps.photo' and mimeType!='application/vnd.google-apps.presentation' and mimeType!='application/vnd.google-apps.script' and mimeType!='application/vnd.google-apps.site' and mimeType!='application/vnd.google-apps.unknown' and mimeType!='application/vnd.google-apps.video' and mimeType!='application/vnd.google-apps.drive-sdk')
    

    '<parentId>' in parents and not (mimeType='application/vnd.google-apps.audio' or mimeType='application/vnd.google-apps.document' or mimeType='application/vnd.google-apps.drawing' or mimeType='application/vnd.google-apps.file' or mimeType='application/vnd.google-apps.folder' or mimeType='application/vnd.google-apps.form' or mimeType='application/vnd.google-apps.fusiontable' or mimeType='application/vnd.google-apps.map' or mimeType='application/vnd.google-apps.photo' or mimeType='application/vnd.google-apps.presentation' or mimeType='application/vnd.google-apps.script' or mimeType='application/vnd.google-apps.site' or mimeType='application/vnd.google-apps.unknown' or mimeType='application/vnd.google-apps.video' or mimeType='application/vnd.google-apps.drive-sdk')
    

    '<parentId>' in parents and not (mimeType='application/vnd.google-apps.audio' or mimeType contains 'application/vnd.google-apps.d' or mimeType contains 'application/vnd.google-apps.f' or mimeType contains 'application/vnd.google-apps.m' or mimeType contains 'application/vnd.google-apps.p' or mimeType='application/vnd.google-apps.script' or mimeType='application/vnd.google-apps.site' or mimeType='application/vnd.google-apps.unknown' or mimeType='application/vnd.google-apps.video')
    

    注意:

    • 如果通过查询搜索的文件超过1000个,为了检索所有文件,需要使用pageToken。这时候需要完成多个请求。请注意这一点。

    参考资料:

    如果这不是您想要的方向,我深表歉意。

    【讨论】:

    • 感谢您的回复。是的,它是有效的解决方案。但无论如何,我不明白为什么 API 不适用于请求,发布有问题。这是正确但未记录的行为还是某些 API 问题?
    • @Dmitrii Vitiiuk 感谢您的回复。关于mimeType='application/vnd.google-apps.###' or not mimeType contains 'application/vnd.google-apps.',对于文件(文档、电子表格等)的Google Docs,仅检索mimeType='###' 的文件。但是在mimeType='application/vnd.google-apps.folder' or not mimeType contains 'application/vnd.google-apps.',除了 Google Docs 之外的文件夹和所有文件。从这种情况来看,我认为这可能是一个错误。所以我提出上述查询作为解决方法。如果这不是您想要的结果,我深表歉意。
    • @Dmitrii Vitiiuk 对于您的问题有什么可以做的吗?如果我的回答对您的情况没有用。我必须道歉并修改它。如果您能合作解决您的问题,我很高兴。我想考虑一下解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2018-09-12
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多