首页 > 解决方案 > 如何在 Mongoose 中获取对象数组而不是 _id

问题描述

我对猫鼬很陌生。我目前正在使用 Node.js、express.js、GraphQL 和 mongoose 构建后端。我有一个 Drink 模式和 DrinkType 模式。我将 DrinkType 模式定义为“酒精”、“果汁”、“茶”。而且我添加了许多饮料,每种饮料都有 DrinkType 参考。然后,我想引用来自 DrinkType 的所有饮料。这是drinkType 的架构

const drinkTypeSchema = new Schema({
  name: {
    type: String,
    required: true,
  },
  createdDrinks: [
    {
      type: Schema.Types.ObjectId,
      ref: 'Drink',
    },
  ],

这是饮料的模式

const drinkSchema = new Schema({
  name: {
    type: String,
    required: true,
  },
  drinkType: {
    type: Schema.Types.ObjectId,
    ref: 'DrinkType',
  },
})

这是饮料分解器。每当创建新饮料时,我都会将其推送到drinkType。

try {
      const result = await drink.save()
      createdDrink = transformDrink(result)
      const drinkType = await DrinkType.findById(args.addDrinkInput.drinkTypeId)
      if (!drinkType) {
        throw new Error('DrinkType not found.')
      }
      drinkType.createdDrinks.push(drink)
      await drinkType.save()
const drinkLoader = new DataLoader(drinkIds => {
  return drinks(drinkIds)
})

const drinks = async drinkIds => {
  try {
    const drinks = await Drink.find({ _id: { $in: drinkIds } })
    return drinks.map(drink => {
      return transformDrink(drink)
    })
  } catch (err) {
    throw err
  }
}

const transformDrink = drink => {
  return {
    ...drink._doc,
    _id: drink.id,
    drinkType: drinkType.bind(this, drink.drinkType),
  }
}


const drinkType = async drinkTypeId => {
  try {
    const drinkType = await drinkTypeLoader.load(drinkTypeId.toString())
    return {
      ...drinkType._doc,
      _id: drinkType.id,
      createdDrinks: () => drinkLoader.loadMany(drinkType._doc.createdDrinks),
    }

我希望这个 createdDrinks 部分返回饮料对象数组,但它只返回 _ids 数组。

我一直在阅读 mongoose 文档,似乎使用 ObjectId 是正确的方法。你介意帮助我吗?

先感谢您。

标签: node.jsmongodbexpressmongoosegraphql

解决方案


推荐阅读