Graphql 为 mongoose 聚合查询返回 null id

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)

这里的问题是:

  • id 为空
  • console.log 和 graphql 的响应是不同的对象

Dan*_*den 4

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)