Graphql为猫鼬聚合查询返回空ID

时间:2019-09-30 11:26:51

标签: mongodb mongoose graphql aggregation-framework apollo-server

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,
      }]

这里的问题是:

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

3 个答案:

答案 0 :(得分:1)

MongoDB中的文档通常没有id属性,只有_id属性。这显示在您看到的控制台输出中。但是,猫鼬模型实例确实有一个id的吸气剂,该吸气剂返回id的值。 From the docs

  

猫鼬默认情况下为您的每个模式分配一个id虚拟获取器,该返回器将文档_id字段强制转换为字符串,对于ObjectIds,则返回其hexString。

findfindOne之类的方法返回的内容是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 jsGraphQL 的猫鼬,我已通过将 id 更改为 _id 并删除其上方的 @prop 来修复它{ {3}}

  @Prop()//remove this
  @Field(() => ID,{ nullable: true })
  _id: string;