Как запросить точку geojson с помощью GraphQl?

Я работаю с nodejs, mongoose и graphql, и у меня есть 2D-координаты geojson в моей базе данных, но я не могу запросить их через graphql, он всегда возвращает null

Я пробовал использовать схему PointObject из https://github.com/ghengeveld/graphql-geojson для замены моей схемы Geometry, но с той же проблемой

Мой код:

const Geometry = new GraphQLObjectType({
  name: 'Geometry',
  fields: () => ({
    type: {
      type: GraphQLString
    },
    coordinates: {
      type: new GraphQLList(GraphQLFloat)
    },
  }),
})

const AntenneType = new GraphQLObjectType({
  name: 'AntenneType',
  fields: () => ({
    _id: {
      type: GraphQLID
    },
    type: {
      type: GraphQLString
    },
    geometry: {
      type: Geometry
    },
    properties: {
      type: Properties
    }
  }),
});

const query = new GraphQLObjectType({
  name: 'Query',
  fields: {
    antennes: {
      type: new GraphQLList(AntenneType),
      resolve: (obj, args, context, info) => {
        return Antenne.find().limit(2) //Antenne is my mongoose model that return same data as in the data.json file
          .then(antennes => {
            console.log(antennes)
            return antennes
          })
      }
    }
  },
});

Один набор данных:

 {
    "properties": {
      ...
    },
    "geometry": {
      "type": "Point",
      "coordinates": [
        2.231666666667,
        49.223611111111
      ]
    },
    "_id": "5cf1901b228293201fe248dc",
    "type": "Feature"
  }

Мой запрос GraphQl:

query{
  antennes{
    _id
    properties{
      generation
      adm_lb_nom
    }
    geometry{
      coordinates 
    }
  }
}

И результат:

{
  "data": {
    "antennes": [
      {
        "_id": "5cf1901b228293201fe248dc",
        "properties": {
          "generation": "2G",
          "adm_lb_nom": "SFR"
        },
        "geometry": {
          "coordinates": null
        }
      }
    ]
  }
}

Я также представил свои полные схемы и данные: https://gist.github.com/yadPe/cb397175a8c39021d0dab2208fe22a4d

Моя схема мангуста (отредактирована в соответствии с ответом @DanielRearden):

const geoSchema = new Schema({
    type: {
        type: String,
        enum: ['Point'],
        required: true
    },
    coordinates: {
        type: [Number],
        required: true
    }
});

const antenneSchema = new Schema({
    type: String,
    properties: {
        sup_id: Number,
        tpo_id: Number,
        sta_nm_dpt: String,
        adr_nm_cp: Number,
        generation: String,
        coordonnees: String,
        sup_nm_haut: Number,
        adm_lb_nom: String,
        emr_lb_systeme: String,
        coord: String,
        emr_dt_service: String,
        date_maj: String,
        code_insee: String,
        nat_id: Number,
        _id: Number,
        com_cd_insee: String,
        id: Number,
        total_de_adm_lb_nom: String,
        sta_nm_anfr: String
    },
    geometry: {
        geoSchema
    }
}, { collection: '2G_France' });

module.exports = mongoose.model('Antenne', antenneSchema);

Я выполнил консольный журнал данных, возвращаемых мангустом:

Antenne.find().limit(1)
  .then(antennes => {
    //return antennes
    return antennes.map(antenne => {
      console.log(antenne.geometry)
      console.log(typeof antenne.geometry)
      console.log(antenne.geometry.type)
      console.log(antenne.geometry.coordinates)
      const test = JSON.parse(JSON.stringify(antenne.geometry)) // idk why I need to do that here
      console.log(test.type)
      console.log(test.coordinates)
      return antenne
    })
  });

И получил следующий результат:

{ type: 'Point',
  coordinates: [ 2.323333333333, 48.346666666667 ] }
object
undefined
undefined
Point
[ 2.323333333333, 48.346666666667 ]

person heinhein    schedule 02.06.2019    source источник
comment
Хм. Проблема не в вашей схеме. Ваш код работает должным образом при возврате только предоставленных вами образцов данных. Я подозреваю, что мангуст не возвращает данные в той форме, которую мы ожидаем, даже если он правильно выводится на консоль. Можете ли вы обновить вопрос, включив в него схему мангуста?   -  person Daniel Rearden    schedule 02.06.2019
comment
Спасибо @DanielRearden за помощь мне. Я добавил свою схему мангуста к вопросу   -  person heinhein    schedule 02.06.2019


Ответы (1)


docs показывают схему точки, определяемую следующим образом:

const geoSchema = new mongoose.Schema({
  type: {
    type: String,
    enum: ['Point'],
    required: true
  },
  coordinates: {
    type: [Number],
    required: true
  }
});

Пример в документации специально предостерегает от определения его как { type: String }. Я подозреваю, что это (как в вашем текущем коде) приводит к сериализации всего поддокумента как String. Это объяснило бы, что вы видите, потому что вы все равно сможете распечатать весь вложенный документ на консоли. GraphQL преобразует поле geometry в строку, которая в JavaScript технически является объектом. Однако он не сможет разрешить поля coordinates или type, потому что эти свойства не существуют в строке, что приводит к разрешению этих полей в null.

Исправьте схему мангуста, и это также должно исправить разрешение поля.

РЕДАКТИРОВАТЬ:

Кроме того, вы должны определить geometry внутри antenneSchema следующим образом:

geometry: geoSchema

or

geometry: {
  type: geoSchema
}
person Daniel Rearden    schedule 02.06.2019
comment
Я думаю, вы указали правильную проблему, но я обновил свою схему мангуста в соответствии с вашим ответом, и у меня все еще есть та же проблема. За исключением того, что если я сделаю JSON.stringify, то JSON.parse своему antenne.geometry object. Я могу получить результат. Я добавил дополнительную информацию в свой вопрос - person heinhein; 02.06.2019
comment
Да, это работает ! Большое спасибо за вашу помощь и время. Хорошего дня - person heinhein; 02.06.2019