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