Как мне создать пользовательский запрос graphql с поддержкой агрегаций Mongodb в Strapi?

#graphql #aggregation-framework #strapi

#graphql ( графический sql ) #агрегация-фреймворк #strapi #graphql #aggregation-framework

Вопрос:

Я попытался создать пользовательский запрос graphql с помощью Strapi, как показано ниже:

 module.exports = {
  definition: `
    type flatOnts {
      site_name: String
      unit_no: String
      firstname: String
      lastName: String
      description: String
      isp_name: String
      serial_number: String
      status: Boolean
    }
  `,
  query: `
    flattenOntObj: [flatOnts]
  `,
  type: {},
  resolver: {
    Query: {
      flattenOntObj: {
        description: "Return a flat ont object",
        resolverOf: "application::onts.onts.aggregate",  
        resolver: async (obj, options, ctx) => {
          const res = await strapi.api.onts.services.onts.aggregate([
            {
              $lookup: {
                from: "onts",
                localField: "ont",
                foreignField: "_id",
                as: "ont_details",
              },
            },
            {
              $replaceRoot: {
                newRoot: {
                  $mergeObjects: [
                    {
                      $arrayElemAt: ["$ont_details", 0],
                    },
                    "$$ROOT",
                  ],
                },
              },
            },
          ]);
          console.log(res);
        },
      },
    },
  },
};
  

Однако после запуска этого на игровой площадке Graphql я получаю сообщение об ошибке «запрещено».

Есть какие-нибудь идеи или указания?

Ценю любую помощь.

Ответ №1:

Неважно, я все понял правильно. Я пропустил раздел документации Strapi, который объясняет это:https://strapi.io/documentation/3.0.0-beta.x/concepts/queries.html#custom-queries

В папке: api/model/services/model.js (мой случай: api/onts/services/ont.js )

 module.exports = {
  aggregate: async (aggArray) => {
    const res = await strapi.query("ont").model.aggregate(aggArray);
    return res;
  },
};
  

а затем в api/onts/config/schema.graphql.js:

 module.exports = {
  definition: `
    type flatOnts {
      site_name: String
      unit_no: String
      firstname: String
      lastName: String
      description: String
      isp_name: String
      serial_number: String
      status: Boolean
    }
  `,
  query: `
    flattenOntObj: [flatOnts]
  `,
  type: {},
  resolver: {
    Query: {
      flattenOntObj: {
        description: "Return a flat ont object",
        // policies: ["plugins::users-permissions.isAuthenticated"],
        resolverOf: "application::onts.onts.find",
        resolver: async (obj, options, ctx) => {
          const aggregationArray = [
            {
              $lookup: {
                from: "onts",
                localField: "ont",
                foreignField: "_id",
                as: "ont_details",
              },
            },
            {
              $replaceRoot: {
                newRoot: {
                  $mergeObjects: [
                    {
                      $arrayElemAt: ["$ont_details", 0],
                    },
                    "$$ROOT",
                  ],
                },
              },
          ];
          const res = await strapi.api.onts.services.onts.aggregate(
            aggregationArray
          );
          return res;
        },
      },
    },
  },
};