首页 > 解决方案 > Mongoose 填充虚拟嵌套数组

问题描述

大家好,

我需要一些帮助来确定这个猫鼬虚拟填充,似乎无法使其工作。所以他是我的设置

node.js v12.18.2

mongodb v4.2.7

猫鼬 5.13.3

modelOne.js 架构

const mongoose = require('mongoose');

const { ObjectId } = mongoose.Types;

require('./specsmodels');
require('./certsmodels;');

const { Schema } = mongoose;

const ModelOneSchema = new Schema(
  {
    ..................................
    ..................................
    modelcert: {
      certs: [{
        _id: { type: mongoose.Schema.Types.ObjectId, ref: 'certsmodel', sparse: true },
        itemID: { type: Number },
      }],
      count: { type: Number, default: 0 },
    },

    modelspec: {
      specs: [{
        _id: { type: mongoose.Schema.Types.ObjectId, ref: 'specsmodel', sparse: true },
        itemID: { type: Number },
      }],
      count: { type: Number, default: 0 },
    },
    ............................
    ............................
  },
  {
    timestamps: true,
    toObject: {
      virtuals: true,
      transform(doc, ret, options) {
        if (options && options.field) {
          ret = getFields(options.field, ret);
        } else {
          delete ret.id;
        }
      },
    },
    toJSON: {
      virtuals: true,
      transform(doc, ret, options) {
        if (options && options.field) {
          ret = getFields(options.field, ret);
        } else {
          delete ret.id;
        }
      },
    },
  },
);

// *************
// virtuals
// *************

ModelOneSchema.virtual('modelspec', {
  ref: 'specsmodel',
  localField: 'modelspec.specs.itemID',
  foreignField: 'itemID',
  justOne: false,
});

ModelOneSchema.virtual('modelcert', {
  ref: 'certsmodel',
  localField: 'modelcert.certs.itemID',
  foreignField: 'itemID',
  justOne: false,
});


const ModelOne = mongoose.model('ModelOne', ModelOneSchema);

module.exports = { ModelOne };

specsmodel.js 架构

const mongoose = require('mongoose');

const { Schema } = mongoose;

const SpecsSchema = new Schema({
  itemID: Number,
  name: { type: Schema.Types.Mixed, default: null },
}, {
   toObject: {
     transform(doc, ret, options) {
       delete ret._id;
     },
   },
   toJSON: {
     transform(doc, ret, options) {
       delete ret._id;
     },
   },
});

module.exports = mongoose.model('specsmodel', SpecsSchema);

certmodel.js 架构

const mongoose = require('mongoose');
const { Schema } = mongoose;

const CertSchema = new Schema({
  itemID: Number,
  name: { type: Schema.Types.Mixed, default: null },
}, {
  toObject: {
    transform(doc, ret, options) {
      delete ret._id;
    },
  },
  toJSON: {
    transform(doc, ret, options) {
      delete ret._id;
    },
  },
});

module.exports = mongoose.model('certsmodel', CertSchema);

mongodb中的model一个文档

[
  {
    "_id": {
      "$oid": "6101b7dafd2bb40298d25189"
    },
    ...........................
    .....................
    "modelcert": {
      "count": 2,
      "certs": [
        {
          "itemID": 1
        },
        {
          "itemID": 2
        }
      ]
    },
    "modelspec": {
      "count": 3,
      "specs": [
        {
          "itemID": 1
        },
        {
          "itemID": 2
        },
        {
          "itemID": 3
        }
      ]
    },
    ................................
    ...............................
    "__v": 0
  }
]

mongodb 中的规范文档

[
  {
    "_id": "5fea449a6ca46d93c010d2e0",
    "itemID": 1,
    "propertyOne": {
      "alpha": "Alpha 1 text",
      "beta": "Beta 1 text",
    }
  },
  {
    "_id": "5fea449a6ca46d93c010d2e1",
    "itemID": 2,
    "propertyOne": {
      "alpha": "Alpha 1 text",
      "beta": "Beta 1 text",
    }
  },
  {
    "_id": "5fea449a6ca46d93c010d2e2",
    "itemID": 3,
    "propertyOne": {
      "alpha": "Alpha 1 text",
      "beta": "Beta 1 text",
    }
  }
 ]

MongoDB中的证书文件

 [
  {
    "_id": "5fea44b96ca46d93c010d32e",
    "itemID": 1,
    "propertyOne": "ACE 1",
    "propertyTwo": "ACE 2",
    "propertyTree": {
      "alpha": "Alpha 1 text",
      "beta": "Beta 1 text",
    },
  },
  {
    "_id": "5fea44b96ca46d93c010d32f",
    "itemID": 2,
    "propertyOne": "MAVERICK 1",
    "propertyTwo": "MAVERICK 2",
    "propertyTree": {
      "alpha": "Alpha 1 text",
      "beta": "Beta 1 text",
    },
  },
  {
    "_id": "5fea44b96ca46d93c010d330",
    "itemID": 3,
    "propertyOne": "GUNHO 1",
    "propertyTwo": "GUNHO 2",
    "propertyTree": {
      "alpha": "Alpha 1 text",
      "beta": "Beta 1 text",
    },
  }
]

这是我的测试

router.post('/testPopulate', async (req, res, next) => {
    try {
      // ModelOne.findById('6101b7dafd2bb40298d25189')
      ModelOne.findOne({ _id: '6101b7dafd2bb40298d25189' })
        .populate('modelspec')
        .exec((err, mspec) => {
          if (err) return res.send(err);
          return res.send(mspec.specs);
        });
    } catch (error) {
      return res.send(error);
    }
  });

结果:

{
    "count": 3,
    "skills": [
        {
            "itemID": 1
        },
        {
            "itemID": 2
        },
        {
            "itemID": 3
        }
    ]
}

预期结果:

{
    "count": 3,
    "skills": [
        {
            "itemID": 1,
            "propertyOne": {
                "alpha": "Alpha 1 text",
                "beta": "Beta 1 text",
            }
        },
        {
            "itemID": 2,
            "propertyOne": {
                "alpha": "Alpha 1 text",
                "beta": "Beta 1 text",
            }
        },
        {
            "itemID": 3,
            "propertyOne": {
                "alpha": "Alpha 1 text",
                "beta": "Beta 1 text",
            }
        }
    ]
}

标签: node.jsmongodbmongoose

解决方案


推荐阅读