【问题标题】:GraphQL & Mongoose Schema - How to store an array of mongoose objectId references to another type?GraphQL & Mongoose Schema - 如何将一组 mongoose objectId 引用存储到另一种类型?
【发布时间】:2021-02-25 23:52:18
【问题描述】:

我目前正在为我当地的比萨店开发比萨订购/跟踪系统。正如您在下面看到的,我定义了 GraphQL 类型和 Mongoose 模型。在我的比萨饼中,我设置了一系列浇头来引用浇头模型。我的问题是,我的突变定义和使用所需参数对该突变的调用是什么样的?

我希望 Mongoose 中的 Pizza 文档包含相关的 ToppingId,以便我可以引用该浇头的其他字段,例如名称和价格。希望这很清楚。也许数组不是解决这个问题的最佳方法??

如果在披萨模型中有更有效的浇头方法,请分享。

GraphQL 类型:

    type Topping {
        id: ID!
        name: String!
        price: Float!
        createdAt: String!
    }
    type Pizza {
        id: ID!
        location: String!
        price: Float!
        toppings: [Topping]!
        createdAt: String!
        toppingCount: Int!
    }

猫鼬模型:

const pizzaSchema = new Schema({
    location: String,
    price: Number,
    toppings: {
        type: Schema.Types.ObjectId,
        ref: "toppings"
    },
    createdAt: String
});

const toppingSchema = new Schema({
    name: String,
    price: Number,
    createdAt: String
});

因此,理想情况下,在数据库中查看披萨时,它应该如下所示:

_id: ObjectId("5fab2e6cc4b5e628685228f6")
> toppings:Array
[
    ObjectId("5fab2e6cc4b5e628685228f7")
    ObjectId("5fab2e6cc4b5e628685228f8")
]
location:"Barcelona"
price:123
createdAt:"12"
__v:0

提前致谢。

编辑:我的突变类型和突变调用/Args + 错误消息

createPizza(pizzaInput: PizzaInput): Pizza!
input PizzaInput {
    location: String!
    price: Float!
    toppings: [ID]!
    createdAt: String!
}

mutation {
  createPizza(pizzaInput: {
    location:"Barcelona"
    price:12
    toppings: [
      "5faaca3129c74ff103d3ccaf"
      "5faaed887ac3c53010b8075b"
    ]
    createdAt:"AAAA"
  }){
    id
    price
    location
    toppings {
      id
    }
    createdAt
    toppingCount
  }
}

错误信息: "ID 不能代表值:"

【问题讨论】:

    标签: node.js mongodb mongoose graphql


    【解决方案1】:

    我相信您需要 PizzaSchema 中的 toppings 值来反映它是一个数组。目前,它只是被定义为这样的对象:

        toppings: {
            type: Schema.Types.ObjectId,
            ref: "toppings"
        },
    

    而不是(注意括号表示数组):

        toppings: [{
            type: Schema.Types.ObjectId,
            ref: "toppings"
        }],
    

    或者完整的,应该是这样的:

    const pizzaSchema = new Schema({
        location: String,
        price: Number,
        toppings: [{
            type: Schema.Types.ObjectId,
            ref: "toppings"
        }],
        createdAt: String
    });
    

    your edit之后更新:

    您是否为 Pizza.toppings 定义了解析器?我猜你的解析器地图中缺少这样的东西:

      Pizza: {
        toppings: (parent) => {
          const obj_ids = parent.toppings.map((id) => ObjectId(id));
          return Topping.find({ _id: { $in: obj_ids } });
        },
      }
    

    我不是 GraphQL 专家,所以我不确定是否有更有效的方法在比萨模型中添加配料,但根据我添加的测试,上述解析器通过了“ID 不能代表价值” ...”问题。

    【讨论】:

    • 谢谢,我实际上是在发布后立即更改的。 GraphQL 突变会是什么样子?在 Playground 中调用突变会是什么样子?这真的是我坚持的:(
    • @alanphil 您能否编辑您的问题以包括您尝试执行的突变类型、您当前尝试使用的内容以及您收到的错误消息?
    • 问题已更新以包含请求!
    • @alanphil 这将取决于您用于 GraphQL 服务器的内容(假设类似:express-graphql、apollo-server-express 等)。
    • 经过一周的尝试解决此问题,我很感激你。解决方案:我创建了一个 Pizza.toppings 解析器,Pizza 现在有一个引用许多浇头的数组。
    猜你喜欢
    • 2017-03-16
    • 2019-12-09
    • 2021-07-31
    • 2020-09-26
    • 2017-11-22
    • 2013-02-06
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多