猫鼬的用途尚不清楚

Usage of mongoose deep-populate unclear

本文关键字:不清楚      更新时间:2023-09-26

我想使用深度填充插件进行猫鼬查询。当然,我是没有经验的,但是,我不会成功地深入填充一些东西。这是我的方案:

var mongoose = require('mongoose');
var MMAnswersSchema = new mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  item: { type: mongoose.Schema.Types.ObjectId, ref: 'MMItem'},
  answer: [
    {
      skalaAnswer: Number,
      freitextAnswer: String,
      multipleChoiceAnswer: String,
      answered_at: { type: Date, required: true, default: Date.now }
    }
  ],
  last_answered: { type: Date, required: true, default: Date.now }
});
MMAnswersSchema.pre('save', function(next) {
  this.last_answered = Date.now;
  next();
});
mongoose.model('MMAnswer', MMAnswersSchema);
var deepPopulate = require('mongoose-deep-populate')(mongoose);
MMAnswersSchema.plugin(deepPopulate);

我把deepPopulate需求的东西放在正确的地方了吗?

我现在使用这条路线来获取我的东西:

// Alle Antworten des aktuellen Users laden
    // Verwendet von der Historie
    .get('/mm-answers/:user_id/get-all-answers', function (req, res, next) {
        Answer.find({user:req.params.user_id}, function (err, answer) {
            if(err){
                return next(err);
            }
            res.json(answer);
        })
            .deepPopulate('item')
    })

我希望它用实际的项目替换id,并且项目本身包含一个"box"字段,我也希望用实际的box文档替换它(这就是我使用深度填充的原因)。使用上面的查询根本不会给我任何结果。我在项目字段中仍然有ID。如果我运行标准的.populate('item')命令,它会用项目本身替换项目ID,但不幸的是,它不会用项目中的BOX ID。(这就是为什么我需要深度填充)。

有人能帮我弄清楚吗?我想我在正确导入/注册插件时犯了一个错误…-.-

在执行查询之前,您需要放置deepPopulate调用,如下所示:

    // Alle Antworten des aktuellen Users laden
    // Verwendet von der Historie
    .get('/mm-answers/:user_id/get-all-answers', function (req, res, next) {
        Answer.find({ user: req.params.user_id }).deepPopulate('item').exec(function (err, answer) {
            if (err) {
                return next(err);
            }
            res.json(answer);
        });
    });

在模型中,您只需要在添加插件时添加想要填充的字段:

 const mongoose = require('mongoose');
 const deepPopulate = require('mongoose-deep-populate')(mongoose);
    const MMAnswersSchema = new mongoose.Schema({
      user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
      item: { type: mongoose.Schema.Types.ObjectId, ref: 'MMItem'},
      answer: [
        {
          skalaAnswer: Number,
          freitextAnswer: String,
          multipleChoiceAnswer: String,
          answered_at: { type: Date, required: true, default: Date.now }
        }
      ],
      last_answered: { type: Date, required: true, default: Date.now }
    });
    MMAnswersSchema.pre('save', function(next) {
      this.last_answered = Date.now;
      next();
    });

    MMAnswersSchema.plugin(deepPopulate, {
    populate: {
        user: {
            select:'_id name lastName'
        },
        item: {
            select:'_id name'
        },
        });
    const MMAnswers = mongoose.model('answers',MMAnswersSchema);
    module.exports = { MMAnswers };

最后,当你需要使用深度填充时,只需添加你想填充的任何字段

await MMAnswers.findOne({your search}).deepPopulate('user').exec();

await MMAnswers.findOne({your search}).deepPopulate('user item').exec();