Graphql为猫鼬聚合查询返回空ID,但在其他猫鼬查询中也可以使用。
这是我的猫鼬图式:
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,
}]
这里的问题是:
答案 0 :(得分:1)
MongoDB中的文档通常没有id
属性,只有_id
属性。这显示在您看到的控制台输出中。但是,猫鼬模型实例确实有一个id
的吸气剂,该吸气剂返回id
的值。 From the docs:
猫鼬默认情况下为您的每个模式分配一个id虚拟获取器,该返回器将文档_id字段强制转换为字符串,对于ObjectIds,则返回其hexString。
find
和findOne
之类的方法返回的内容是Model的具有此吸气剂的实例。但是,使用aggregate
会导致返回纯JavaScript对象(没有getter)。
您可以为id
字段编写一个解析程序,以从id
或_id
中提取值:
function resolve (parent, args, context, info) {
return parent.id || parent._id
}
答案 1 :(得分:0)
如果您不想更改每个ID,只需添加两个ID。
type Product {
id: ID
_id: ID
price: String
}
答案 2 :(得分:0)
如果您使用带有 nest js
和 GraphQL
的猫鼬,我已通过将 id
更改为 _id
并删除其上方的 @prop
来修复它{ {3}}
@Prop()//remove this
@Field(() => ID,{ nullable: true })
_id: string;