Gatsby是否支持MongoDB关系?

时间:2020-05-27 04:49:48

标签: mongodb graphql gatsby

我正在建立一个个人博客并选择Gatsby是因为显而易见的原因(性能高且易于入门),并且我对前端有一些React背景。另外,我已经构建了一个简单的应用程序来创建我的内容(html字符串)并使用快递服务器存储在MongoDB数据库中。现在,对于博客,我只是尝试使用gatsby-source-mongodb插件从MongoDB中提取数据。

我的MongoDB模式具有关系。例如,“发布”模式具有“用户”属性,该属性是从“用户”模式引用用户的ObjectID。我对gatsby-source-mongodb的配置如下:

    {
      resolve: 'gatsby-source-mongodb',
      options: {
          dbName: 'KathaDB',
          collection: 'posts',
          server: {
              address: "somecluster",
              port: 27017
          },
          auth: {
              user: 'someuser',
              password: 'somepasswd'
          },
          extraParams: {
            replicaSet: 'test',
            ssl: true,
            authSource: 'admin',
            retryWrites: true,
            preserveObjectIds: true
        }

      }
  }

我有几个问题:

  1. 查询时,我从“发布”架构中获取了所有属性,但响应中没有“用户”属性。我不知道是否是由于属性的类型。我挖了一点,发现了类似的问题here。看来他们已经通过保留ObjectID解决了该问题,但我什至没有得到ObjectID类型的属性。
  2. 另一件事,这个插件支持关系吗?例如,给出对象ID时是否可以获取“用户”数据?

1 个答案:

答案 0 :(得分:4)

可以。

MongoDB依赖于ObjectID进行关联,因此您可能必须在插件选项中添加preserveObjectIds: true

{
  resolve: "gatsby-source-mongodb",
  options: {
    dbName: "KathaDB",
    collection: "posts",
    server: {
      address: "somecluster",
      port: 27017,
    },
    auth: {
      user: "someuser",
      password: "somepasswd",
    },
    extraParams: {
      replicaSet: "test",
      ssl: true,
      authSource: "admin",
      retryWrites: true,
      preserveObjectIds: true,
    },
    preserveObjectIds: true, // <= here
  },
};

我不确定gatsby-source-mongodb是否开箱即用地创建关系(如果我的记忆正确,我不认为会创建关系),但是使用ObjectIds可以创建外部GraphQL建立关键关系。

在盖茨比,有两种方法可以做到这一点:

  1. Using mappings in gatsby-config.js
  2. Using a GraphQL @link directive通过Gatsby的模式自定义(来自v2.2)

我推荐第二个选项,因为它是一种更GraphQL的处理方式,它发生在发生大多数节点操作的gatsby-node.js中。但是,如果您刚开始使用Gatsby和GraphQL,则第一个选项可能更易于设置。