如何在 Apollo 解析器 (Meteor/Apollo/Graphql) 中 return 聚合查询?

How to return an aggregate query in an Apollo resolver (Meteor/Apollo/Graphql)?

我正在尝试 运行 在 Meteor 中使用聚合查询,但我无法弄清楚如何 return 聚合查询。

在我的 GraphQL 架构中:

type UserRelation {
    date: String!
    userID: String!
}
type UserData {
    userID: String!
    description: String!
    friends_list: [UserRelation]!
}
extend type Query {
    getFriends(userID: String!, friendID: String): [UserRelation]
}

在我的 resolvers.js:

import UserData from "./userData";
export default {
    Query: {
        getFriends(obj, args, context) {
            if (args.friendID) return UserData.rawCollection().aggregate([
                {
                    $match: {
                        _id: 'cuS7KebEQDRv2iFpJ'    
                    }
                },
                {
                    $unwind: '$friends_list'
                },
                {
                    $match: {
                        'friends_list._id': '8GW4gjwWhkEexfndd'
                    }
                }
            ]);
            return UserData.findOne({ userID: args.userID }, {fields: {_id: 0,  friends_list: 1 }}).friends_list;
        }
    }
}

在这个硬编码示例中,我的数据库中有以下文档:

我想 return 整个文档只包含具有匹配 _id 的用户,并且 friends_list 有另一个用户具有第二个匹配的 _id。所以这样我就可以 return 整个文档只用 friends_list 数组中的那个 1 元素而不是所有其他元素。

现在这个查询在 Robo3T(一个 MongoDB GUI)中工作正常,但是当我在 Graphiql 中 运行 它时 return 语句有一个问题,因为抛出了一个错误状态: "Expected Iterable, but did not find one for field \"Query.getFriends\"." 当我记录该语句时,我看到 Mongo AggregationCursor。但是我不确定我应该如何将其“转换”为解析器可以正确 return 的类型。

感谢任何帮助,谢谢!

我不知道我是否真的弄明白了,因为我需要对其进行更多测试,但到目前为止这是有效的,在我的 resolvers.js 中我有:

import UserData from "./userData";
async function getFriend(userID, friendID) {
    return UserData.rawCollection().aggregate([
        {
            $match: {
                _id: userID    
            }
        },
        {
            $unwind: '$friends_list'
        },
        {
            $match: {
                'friends_list._id': friendID
            }
        }
    ]).toArray();
}

export default {
    Query: {
        async getFriends(obj, args, context) {
            if (args.friendID){
                const result = await getFriend(args.userID, args.friendID);
                return result[0].friends_list;
            }
            return UserData.findOne({ userID: args.userID }, {fields: {_id: 0,  friends_list: 1 }}).friends_list;
        }
    }
}

通过使其异步,我能够完成这项工作。不确定这有什么影响,但到目前为止它有效。如果有人能够对此进行审查并提出一些批评以改进它,我们将不胜感激,因为有关此的任何信息都非常难以找到,因为到目前为止我还没有看到任何用例。