[英]Graphql returns null id for mongoose aggregation query
Graphql 为 mongoose 聚合查询返回 null id,但其他 mongoose 查询工作正常。
这是我的 mongoose 架构:
const { Schema } = mongoose;
const ObjectId = Schema.Types.ObjectId;
const productSchema = new Schema({
_id: ObjectId,
price: Number
})
const Product = mongoose.model('Product', productSchema, 'Product')
这是我的 Graphql 模式:
type Product {
id: ID
price: String
}
Graphql 正常查询:
context.Product.findOne()
console.log 的结果:
[ {
price: 10,
_id: 5d7f8efebff791dcd3bb1b69
}]
graphql 的结果:
"getSearch": [
{
"id": "5d7f8efebff791dcd3bb1b69",
"price": 10,
}]
这里一切都很好。 现在问题出在聚合查询上:
GraphQL查询:
context.Product.aggregate(
[
{ $sample: { size: 1 } }
]
)
console.log 的结果:
[ { _id: 5d7f8f23bff791dcd3bb1da3,
price: 5
}]
GraphQL 的结果:
"test": [
{
"id": null",
"price": 7,
}]
这里的问题是:
MongoDB 中的文档通常没有id
属性,只有_id
属性。 这显示在您看到的控制台 output 中。 但是,mongoose model 实例确实有一个返回id
值的id
获取器。 从文档:
Mongoose 默认情况下为您的每个模式分配一个 id 虚拟 getter,它返回转换为字符串的文档 _id 字段,或者在 ObjectIds 的情况下,它的 hexString。
find
和findOne
等方法返回的是具有此 getter 的Model的实例。 但是,使用aggregate
结果会返回普通的 JavaScript 对象(没有 getter)。
您可以为id
字段编写解析器以从id
或_id
中提取值:
function resolve (parent, args, context, info) {
return parent.id || parent._id
}
将id
元素添加到结果对我来说效果很好
const res = await Product.aggregate(
[
{ $sample: { size: 1 } }
]
)
res.forEach(element => {
element.id = element._id
});
return res;
如果您不想更改它的每个实例,只需添加两个 ID。
type Product {
id: ID
_id: ID
price: String
}
如果您将 mongoose 与nest js
和GraphQL
一起使用,我已通过将id
更改为_id
并删除其上方的@prop
来修复它Example on github
@Prop()//remove this
@Field(() => ID,{ nullable: true })
_id: string;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.