Mik*_*ill 5 mongoose mongodb aggregation-framework graphql apollo-server
Graphql 对于 mongoose 聚合查询返回 null id,但可以正常工作其他 mongoose 查询。
这是我的猫鼬架构:
const { Schema } = mongoose;
const ObjectId = Schema.Types.ObjectId;
const productSchema = new Schema({
_id: ObjectId,
price: Number
})
const Product = mongoose.model('Product', productSchema, 'Product')
Run Code Online (Sandbox Code Playgroud)
这是我的 Graphql 架构:
type Product {
id: ID
price: String
}
Run Code Online (Sandbox Code Playgroud)
Graphql普通查询:
context.Product.findOne()
Run Code Online (Sandbox Code Playgroud)
console.log 的结果:
[ {
price: 10,
_id: 5d7f8efebff791dcd3bb1b69
}]
Run Code Online (Sandbox Code Playgroud)
graphql 的结果:
"getSearch": [
{
"id": "5d7f8efebff791dcd3bb1b69",
"price": 10,
}]
Run Code Online (Sandbox Code Playgroud)
这里一切都很好。 现在问题出在聚合查询上:
GraphQL 查询:
context.Product.aggregate(
[
{ $sample: { size: 1 } }
]
)
Run Code Online (Sandbox Code Playgroud)
console.log 的结果:
[ { _id: 5d7f8f23bff791dcd3bb1da3,
price: 5
}]
Run Code Online (Sandbox Code Playgroud)
GraphQL 的结果:
"test": [
{
"id": null",
"price": 7,
}]
Run Code Online (Sandbox Code Playgroud)
这里的问题是:
MongoDB 中的文档通常没有属性id,只有_id属性。这显示在您看到的控制台输出中。但是,猫鼬模型实例确实有一个 getter,用于id返回 的值id。来自文档:
Mongoose 默认为每个模式分配一个 id 虚拟 getter,它返回文档 _id 字段转换为字符串,或者在 ObjectIds 的情况下,返回其十六进制字符串。
find和等方法返回的是具有此 getter 的ModelfindOne实例。但是,使用结果会返回纯 JavaScript 对象(没有 getter)。aggregate
您可以为该字段编写解析器以从或 中id提取值:id_id
function resolve (parent, args, context, info) {
return parent.id || parent._id
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1726 次 |
| 最近记录: |