【发布时间】:2021-02-25 09:42:48
【问题描述】:
大家好,我正在使用 graphql 和 mongodb 创建一个 api。我正在使用 mongodb 聚合来过滤我的文档。
export const findAllVariants = async (_, { orderby, filter, skip, sort, perPage }, context) => {
await jwtAuthentication.verifyTokenMiddleware(context);
try {
const aggregate = Variant.aggregate();
const match = { $and: [] };
if (filter) {
await filter.split(' ').forEach((f) => {
match.$and.push({
$or: [
{
color: {
$regex: new RegExp(transliterate(f), 'i')
}
},
{
size: {
$regex: new RegExp(transliterate(f), 'i')
}
},
{
sku: {
$regex: new RegExp(transliterate(f), 'i')
}
},
{
barcode: {
$regex: new RegExp(transliterate(f), 'i')
}
}
]
});
});
aggregate.match(match);
}
const options = {
allowDiskUse: true,
limit: perPage,
page: skip,
sortBy: { [orderby]: sort }
};
return Variant.aggregatePaginate(aggregate, options, (err, results, pageCount, count) => {
if (err) {
return new ApolloError(`There was an error ${err}`);
}
console.log(results);
return {
count,
variants: results,
pageCount,
skip
};
});
} catch (err) {
return new ApolloError(`There was an error ${err}`);
}
};
我的graphql def是这个
export default gql`
type VariantsResult {
variants: [Variant]
count: Int
pageCount: Int
skip: Int
}
type Variant {
id: String!
color: String
size: String
quantity: Int
sku: String
barcode: String
price: Price
images: [String]
}
input VariantInfo {
id: ID!
color: String!
size: String!
quantity: Int
sku: String!
barcode: String!
price: InputPrice!
images: [ImageInfo]!
}
extend type Query {
findAllVariants(orderby: Int, filter: String, skip: Int, sort: Int, perPage: Int): VariantsResult
}
extend type Mutation {
createVariant(variantInfo: VariantInfo): Variant!
removeVariantFromProduct(variantInfo: VariantInfo, productInfo: ProductInfo): Product!
addVariantToProduct(variantInfo: VariantInfo, productInfo: ProductInfo): Product!
editVariantFromProduct(variantInfo: VariantInfo): Variant!
}
`;
现在在阿波罗操场上,当我提供所需的数据并返回 id 值时,它会显示以下消息“无法为不可为空的字段 Variant.id 返回 null。”
这仅发生在 id 字段中,所有其他字段都可以正常工作。 请帮忙!
【问题讨论】: