node.js - 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",
}
}
]
}
解决方案
推荐阅读
- selenium-webdriver - 如何通过 ChromeDriver 在 Chromium 中更改“阻止第三方 cookie”?
- angular - Angular 9生产错误:无法设置(抽象)类MyFilter {}的属性ɵfac,它只有一个getter
- html - ESP32 上自动驾驶汽车的 HTML 界面
- javascript - 移动内容时的 Vue 过渡
- emacs - (厄运)emacs:lsp-mode 在 sbt-start 上找不到项目根目录
- c# - 实体框架代码优先 - 在域模型上使用接口
- php - 如何让合适的人访问此功能?
- javascript - ajax 或 jquery 不显示数据 Laravel
- python - django:当文件不存在时重定向后意外的文件下载
- masm - masm mov mybyte, -130 为什么这样有效?