GraphQL错误返回mongoose聚合命令的结果

时间:2018-01-11 13:38:09

标签: mongodb mongoose aggregation-framework graphql graphql-js

此问题与the answer posted here

有关

我需要从GraphQL查询返回聚合结果。这是查询代码:

const companiesWithNoUsers = {
    type: new GraphQLList(CompanyType),
    resolve(root, args, context) {
        return Company.aggregate([
            {
                $lookup: {
                    from: "users",
                    localField: "id",
                    foreignField: "company_id",
                    as: "company_users"
                }
            },
            {
                $match: {
                    "company_users:0": {
                        $exists: false
                    }
                }
            }
        ]).exec();
    }
};

我在GraphQL上遇到了以下错误:

Expected value of type \"Company\" but got: [object Object].

阅读the docs后,我想这个错误与以下语句有关:

“返回的文件是普通的javascript对象,而不是mongoose文档(因为可以返回任何形状的文档)。”

所以,我需要返回一个GraphQL CompanyType。如何将返回值转换为GraphQL预期的格式?这个错误还有另一个解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试将结果列表转换为Mongoose文档,并将结果包装在Promise中:

Company.aggregate(pipeline).exec((err, result) => 
    (    
        new Promise((resolve, reject) => {
            if (err) {
                reject(err)
            } else {                    
                resolve(result.map(doc => { 
                    delete doc.company_users;
                    return new Company( doc );
                }))
            }
        })
    ))