通过关系从Graphql获取值

时间:2018-07-31 17:35:21

标签: mongodb graphql graphql-js type-definition graphql-tools

当前,我正在将typeDefinitionsgraphql-tools一起使用。一切都OK,但是架构越复杂,获取这些值就越困难。 我有这些型号:

imagenes_model.js

const mongoose = require('mongoose');

const imagenesSchema = new mongoose.Schema({
    Imagen: { type: mongoose.Schema.Types.ObjectId, ref: 'Imagen'},
    orden: Number,
    Propietario: { type: mongoose.Schema.Types.ObjectId, ref: 'Propietario', required: [true, "El campo Propietario es obligatorio"]},
})

module.exports = mongoose.model('Imagenes', imagenesSchema);

imagen_model.js

const mongoose = require('mongoose');

const imagenSchema = new mongoose.Schema({
    nombre_es: {type: String, trim: true},
    nombre_en: {type: String, trim: true},
    nombre_fr: {type: String, trim: true},
    nombre_de: {type: String, trim: true},
    descripcion_es: {type: String, trim: true},
    descripcion_en: {type: String, trim: true},
    descripcion_fr: {type: String, trim: true},
    descripcion_de: {type: String, trim: true},
    file: {type: String, trim: true, required: [true, "El campo archivo es obligatorio"]},    
    //.......... more properties
}, {collection: "imagenes"});

module.exports = mongoose.model('Imagen', imagenSchema);

propietario_model.js

const mongoose = require('mongoose');

const propietarioSchema = new mongoose.Schema({
  nombre: {
    type: String,
    unique: true,
    trim: true,
    required: [true, "El campo nombre es obligatorio"]
  },
  multiidioma: {type: Boolean, default: false },
  publico: {type: Boolean, default: true },
  Subpropietarios: [{
      _id: { type: mongoose.Schema.Types.ObjectId, ref: 'Propietario'}
  }],
}, {collection: "propietarios"});

module.exports = mongoose.model('Propietario', propietarioSchema);

articulo_publicacion_model.js

const mongoose = require('mongoose');
const Imagenes = require('./submodels/imagenes_model').schema;

const articuloPublicacionSchema = new mongoose.Schema({
    nombre_es: {type: String, trim: true},
    nombre_en: {type: String, trim: true},
    nombre_fr: {type: String, trim: true},
    nombre_de: {type: String, trim: true},
    descripcion_es: {type: String, trim: true},
    descripcion_en: {type: String, trim: true},
    descripcion_fr: {type: String, trim: true},
    descripcion_de: {type: String, trim: true}, 
    Webs: [
      {nombre: {type: String, trim: true}, url: {type: String, trim: true}}
    ],
    Propietario: { type: mongoose.Schema.Types.ObjectId, ref: 'Propietario', required: [true, "El campo Propietario es obligatorio"]},
    Etiquetas: [{clave: String}],
    Imagenes: [Imagenes],
    //............more properties
}, {collection: "articulos_publicaciones"});

module.exports = mongoose.model('ArticuloPublicacion', articuloPublicacionSchema);

如果使用Graphql,则可以获得有关“ articulo_publicacion_model”的“ 一切”。对我来说,不可能获得与“ articulo_pucblicacion”的一组图像有关的图像名称。像这样:

mongodb集合“ publicaciones”

{
    "_id" : ObjectId("5b5e0a7537272c376c69a615"),
    "nombre_es" : "Nombre es1",
    "nombre_en" : "Nombre en1",
    "nombre_fr" : "Nombre fr1",
    "nombre_de" : "Nombre de1",
    "descripcion_es" : "Descripcion es1",
    "descripcion_en" : "Descripcion en1",
    "descripcion_fr" : "Descripcion fr1",
    "descripcion_de" : "Descripcion de1",
    "Webs" : [ 
        {
            "_id" : ObjectId("5b5e0f2637272c376c69a622"),
            "nombre" : "aaa11",
            "url" : "http://www.aaaa11.com"
        }, 
        {
            "_id" : ObjectId("5b5e0f2637272c376c69a621"),
            "nombre" : "bbbbb11",
            "url" : "http://www.bbbbbb11.com"
        }, 
        {
            "_id" : ObjectId("5b5e0f2637272c376c69a620"),
            "nombre" : "cccc11",
            "url" : "http://www.cccccc11.com"
        }
    ],
    "Etiquetas" : [ 
        {
            "_id" : ObjectId("5b5e0f2637272c376c69a624"),
            "clave" : "aaaaa11"
        }, 
        {
            "_id" : ObjectId("5b5e0f2637272c376c69a623"),
            "clave" : "bbbb11"
        }
    ],
    "Propietario" : ObjectId("000000000000000000020071"),
    "Imagenes" : [ 
        {
            "_id" : ObjectId("555e0f2637272c376c69a624"),
            "Imagen" : ObjectId("500000000000000000009627"),
            "orden" : 1,
            "Propietario" : ObjectId("000000000000000000020071")
        }, 
        {
            "_id" : ObjectId("55540f2637272c376c69a624"),
            "Imagen" : ObjectId("500000000000000000009629"),
            "orden" : 2,
            "Propietario" : ObjectId("000000000000000000020071")
        }
    ]
}

mongodb集合“ imagenes”

{
    "_id" : ObjectId("500000000000000000009627"),
    "nombre_es" : "Sede en Construcción",
    "file" : "9/6/arc_9627.jpg"
}
{
    "_id" : ObjectId("500000000000000000009629"),
    "nombre_es" : "Wellcome home",
    "file" : "9/6/arc_9629.jpg"
}

mongodb集合“ propietarios”

{
    "_id" : ObjectId("000000000000000000020071"),
    "nombre" : "Servicio - Vías y Obras",
    "multiidioma" : false,
    "publico" : true
}

使用该解析器,我可以从“ articulo_publicaciones_model”,Webs,“ nombres”等中获取Propietario的值,但是我不知道如何从“ Imagenes”中获取相关信息。我读到我可能会使用Dataloader,但这对我来说并不成功。这是我的解析器:

const getProjection = require('./../../utils/get_projection');

const ImagenesModel = require('./../../models/submodels/imagenes_model');
const ImagenModel = require('./../../models/imagen_model');
const PropietarioModel = require('./../../models/propietario_model');
const Logger = require('./../../utils/logger');

const logger = new Logger();


function PropietarioArticuloPublicacion(root, args, context, _info) {
    const PROJECTION = getProjection(_info.fieldNodes[0]);
    return PropietarioModel.findById(root.Propietario).select(PROJECTION).exec()
        .then(foundPropietario => foundPropietario)
        .catch((error) => {
            logger.error(error);
            return null;
        });
}

function EtiquetasArticuloPublicacion(root, args, context, _info) {
    const arrayOfPromises = [];
    root.Etiquetas.forEach((Etq) => {
        arrayOfPromises.push(Etq.clave)
    });

    return Promise.all(arrayOfPromises);
}

//.....more functions

module.exports = {
    .....
    Propietario: PropietarioArticuloPublicacion,
    Etiquetas: EtiquetasArticuloPublicacion,
    Imagenes: ImagenesArticuloPublicacion,
    ......
};

如何为该功能ImagenesArticuloPublicacion出价?我对此感到非常沮丧和沮丧。

0 个答案:

没有答案