繁体   English   中英

Graphql 为 mongoose 聚合查询返回 null id

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

这里的问题是:

  • 编号是 null
  • 来自 console.log 和 graphql 的响应是不同的对象

MongoDB 中的文档通常没有id属性,只有_id属性。 这显示在您看到的控制台 output 中。 但是,mongoose model 实例确实有一个返回id值的id获取器。 从文档

Mongoose 默认情况下为您的每个模式分配一个 id 虚拟 getter,它返回转换为字符串的文档 _id 字段,或者在 ObjectIds 的情况下,它的 hexString。

findfindOne等方法返回的是具有此 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 jsGraphQL一起使用,我已通过将id更改为_id并删除其上方的@prop来修复它Example on github

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM