使用 graphql 和 nodejs 填充猫鼬模式

Posted

技术标签:

【中文标题】使用 graphql 和 nodejs 填充猫鼬模式【英文标题】:Populating mongoose schema with graphql and nodejs 【发布时间】:2020-08-27 05:13:57 【问题描述】:

大家好,我在这里使用的是带有 mongoose 和 nodejs 的 graphql,所以我的架构是这样的

booking.js

const mogoose = require("mongoose");
const autopopulate = require('mongoose-autopopulate')
const Schema = mogoose.Schema;
const bookingSchema = new Schema(

  event:
    type:Schema.Types.ObjectId,
    ref:'Event',
    autopopulate:true
  ,
,timestamps:true);

module.exports=mogoose.model('Booking',bookingSchema.plugin(autopopulate))

event.js

const mogoose = require("mongoose");
const autopopulate = require('mongoose-autopopulate')
const Schema = mogoose.Schema;
const eventSchema = new Schema(
  title: 
    type: String,
  ,
  description: 
    type: String,
  ,
  price: 
    type: Number,
  ,
  date: 
    type: String,
    required: true,
  ,
  creator:
    type:Schema.Types.ObjectId,
    ref:'User',
    autopopulate:true
  
);

module.exports=mogoose.model('Event',eventSchema.plugin(autopopulate))

然后在我的解析器中删除一个事件,我做了这样的事情

cancelEvent: async (args) => 
    try 
      const booking = await Booking.findById(args.bookingID);
        const event=...booking.event,_id:booking.event._id
       await Booking.deleteOne( _id: args.bookingID );
       return event
     catch (err) 
      throw err;
    
  ,

console.log(event._doc) 给我

 _id: 5eb94b2ee627fc04777835d2,
  title: '22222',
  description: 'sd',
  date: 'df',
  creator:
    createdEvents:
      [ [Object], [Object], [Object], [Object], [Object], [Object] ],
     _id: 5eb80367c2483e16a9e86502,
     email: 'sdd',
     password:
      '$2a$12$3lNyWl8w9gWLo8TtJDL2Te6Wg6psQOrOveinifFF4Jjeij9b4P2Ga',
     __v: 16 ,
  __v: 0 

所以可以说我的数据库是这样的

_id:ObjectId("5eb96b75c43aca45ff6aa934")
user:ObjectId("5eb80367c2483e16a9e86502")
event:ObjectId("5eb94b2ee627fc04777835d2")
createdAt:"2020-05-11T14:42:22.470+00:00"
updatedAt:"2020-05-11T14:42:22.470+00:00"
__v:"0"

然后我写了我的graphql查询

mutation
  cancelEvent(bookingID:"5eb96b75c43aca45ff6aa934")
   _id,
    event
      title
      
  

我得到的结果是


  "data": 
    "cancelEvent": 
      "_id": "5eb94b2ee627fc04777835d2",
      "event": null
    
  

id 是我在解析器中返回的事件,但事件标题为空, 即使我尝试过

mutation
  cancelEvent(bookingID:"5eb96b75c43aca45ff6aa934")
   title

  

它说

无法查询类型 Booking 的字段标题

那么我如何获取与刚刚删除的预订相关的事件的标题?

【问题讨论】:

【参考方案1】:

如果你想让cancelEvent返回Booking,那么这个突变已经是正确的了

mutation 
  cancelEvent(bookingID:"5eb96b75c43aca45ff6aa934")
   _id,
    event 
      title
      
  

但在您的解析器中,您必须返回 booking 而不是 event

      const booking = await Booking.findById(args.bookingID);
      await Booking.deleteOne( _id: args.bookingID );
      return booking

否则如果要返回event,则必须将cancelEvent突变的类型更改为Event

在这种情况下,您可以使用此突变

mutation 
  cancelEvent(bookingID:"5eb96b75c43aca45ff6aa934") 
    title
  

使用以下解析器

      const booking = await Booking.findById(args.bookingID);
      await Booking.deleteOne( _id: args.bookingID );
      return booking.event

【讨论】:

啊啊发现cancelEvent的返回类型是booking而不是Event type

以上是关于使用 graphql 和 nodejs 填充猫鼬模式的主要内容,如果未能解决你的问题,请参考以下文章

从带有子字段的猫鼬模式生成 Graphql 类型

猫鼬异步/等待

如何使用猫鼬“填充”来指定不同集合的现有文档的路径?

猫鼬中的填充方法(节点js)

猫鼬中的填充方法(节点js)

与填充一起使用时,猫鼬查询性能低下