пн goose виртуальный заполнить бесконечный цикл - PullRequest
2 голосов
/ 02 февраля 2020

Я пытаюсь заполнить тег учебниками, которые с ним связаны, когда я использую .populate () в запросе, он работает, но когда я делаю это непосредственно в модели, у меня есть изначально l oop .

Вот мой код:

Tag. js

const mongoose = require("mongoose");

const tagSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true,
      unique: true,
      trim: true
    }
  },
  {
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
  }
);

tagSchema.virtual("tutorials", {
  ref: "Tutorial",
  foreignField: "tags",
  localField: "_id"
});

tagSchema.pre(/^find/, function(next) {
  // That's the code that causes an infinite loop
  this.populate({
    path: "tutorials",
    select: "-__v"
  });

  next();
});

const Tag = mongoose.model("Tag", tagSchema);

module.exports = Tag;

Учебник. js

const mongoose = require('mongoose');

const tutorialSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
    unique: true,
    trim: true
  },
  tags: {
    type: [
      {
        type: mongoose.Schema.ObjectId,
        ref: 'Tag'
      }
    ]
  }
});

const Tutorial = mongoose.model('Tutorial', tutorialSchema);

module.exports = Tutorial;

Я хотел бы знать, что вызывает бесконечность l oop и почему он работает с запросом, а не с моделью? Спасибо!

Редактировать

Вот код, который работает

Tag. js

const mongoose = require("mongoose");

const tagSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true,
      unique: true,
      trim: true
    }
  },
  {
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
  }
);

tagSchema.virtual("tutorials", {
  ref: "Tutorial",
  foreignField: "tags",
  localField: "_id"
});

const Tag = mongoose.model("Tag", tagSchema);

module.exports = Tag;

Учебник. js

const mongoose = require('mongoose');

const tutorialSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true,
    unique: true,
    trim: true
  },
  tags: {
    type: [
      {
        type: mongoose.Schema.ObjectId,
        ref: 'Tag'
      }
    ]
  }
});

const Tutorial = mongoose.model('Tutorial', tutorialSchema);

module.exports = Tutorial;

TagController. js

const Tag = require('./../models/tagModel');

exports.getAllTags = async (req, res) => {
  try {
    const docs = await Tag.find().populate({
      path: 'tutorials',
      select: '-__v'
    });

    res.status(200).json({
      // some code
    });
  } catch(err) => {
    // some code
  }
});
...