gpt4 book ai didi

node.js - 为 MEAN 应用程序生成 Mongoose DTO

转载 作者:可可西里 更新时间:2023-11-01 09:57:53 25 4
gpt4 key购买 nike

我是 mongoose 和 Node 的新手,我正在使用 MEAN 堆栈(Mongo ExpressJS AngularJS Node )构建应用程序。

我过去使用 asp.net WebAPI 构建了很多 API,但我找不到任何关于使用 DTO 或 View 模型的文档,以减少在我之间来回传输的 JSON 量服务器和我的前端。

我的应用程序是关于用户在线填写的调查。每个答案然后被用户用来产生一个分数。

我的模型:

var UserSchema = new Schema({
email: {type: String, trim: true,default: '', match: [/.+\@.+\..+/,'']},
status: {type: String},
token:{type: String, default: crypto.randomBytes(64).toString('hex')},
score: {
managementExperience: {type: Number},
managementSkills: {type: Number},
relevantKnowledge: {type: Number},
commitment: {type: Number},
acceptanceOfChange: {type: Number},
age: {type: Number},
totalScore: {type: Number}
},
answers: [
{
optionId: {type: Schema.Types.ObjectId}
}
]
});

var SurveySchema = new Schema({
client_id:{type: Schema.Types.ObjectId, ref: 'Client' },
creationDate:{type: Date,default: Date.now},
title: {type: String, trim: true},
surveyVersion: { type: Schema.Types.ObjectId, ref: 'SurveyVersion' },
users:[UserSchema]
});

调查屏幕本身有效,但在生成结果仪表板时,我想发送一个 DTO 而不是整个 SurveySchema,就像这个模型:

var SurveySchemaLight = new Schema({
client_id:{type: Schema.Types.ObjectId, ref: 'Client' },
creationDate:{type: Date,default: Date.now},
title: {type: String, trim: true},
users:[{
email: {type: String, trim: true,default: '', match: [/.+\@.+\..+/,'']},
status: {type: String}
}]
});

在 .Net 世界中,我想让这个模型有一个构造函数,该构造函数将 SurveySchema 实例作为参数,但我找不到让它工作的方法。

我还尝试将两个模式链接到 mongodb 中的同一个集合:

mongoose.model('Survey', SurveySchema);
mongoose.model('SurveyLight', SurveySchemaLight, 'surveys');

但是当我在 SurveyLight 架构上运行以下查询时,我仍然返回了 Survey 中的所有字段:

SurveyLight.find({'client_id': req.params.clientID}).exec(function(err, surveyList){
res.json(surveyList);
});

在我的堆栈中拥有 DTO/ View 模型机制的最佳实践是什么?

谢谢

最佳答案

对于一般的“mongoose”和 MongoDB 查询,您只需在输出中“投影”您需要的字段,而忽略您不想要的其他字段。

作为一个独立的例子:

var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;

var childSchema = new Schema({
"longName": String,
"email": String,
"status": String
})

var parentSchema = new Schema({
"name": String,
"longDescription": String,
"children": [childSchema]
})

mongoose.connect('mongodb://localhost/test');

var Parent = mongoose.model( 'Parent', parentSchema );

async.waterfall(
[
// remove any samples
function(callback) {
Parent.remove({},function(err,res) {
callback(err)
});
},

// insert some test data
function(callback) {
Parent.create(
{
"name": "Bill",
"longDescription": "Something we don't want to see",
"children": [
{ "longName": "don't want", "email": "a@example.com", "status": "A" },
{ "longName": "don't want", "email": "b@example.com", "status": "B" }
]
},
function(err,doc) {
console.log( doc );
callback(err,doc);
}
)
},

// Fetch just the fields we want
function(doc,callback) {
Parent.find({},"name children.email children.status", callback);
}
],

// Ouput results
function(err,result) {
if (err) throw err;
console.log(result);
process.exit();
}
);

输出结果如下:

// The original form of the documents
{ __v: 0,
name: 'Bill',
longDescription: 'Something we don\'t want to see',
_id: 5598b6bad439a31807bfe746,
children:
[ { longName: 'don\'t want',
email: 'a@example.com',
status: 'A',
_id: 5598b6bad439a31807bfe748 },
{ longName: 'don\'t want',
email: 'b@example.com',
status: 'B',
_id: 5598b6bad439a31807bfe747 } ] }

// The output document with just selected fields
[ { _id: 5598b6bad439a31807bfe746,
name: 'Bill',
children:
[ { email: 'a@example.com', status: 'A' },
{ email: 'b@example.com', status: 'B' } ] } ]

如果你想“排除”字段而不是显式命名它们,那么用 - 作为前缀

"-longName -children.logDescription"

但是您不能“混合”这两个术语,"-_id"

除外

关于node.js - 为 MEAN 应用程序生成 Mongoose DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31227119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com