在我的应用程序中,我的用户能够与许多不同类型的对象(physical_drives,设备,配置文件,主题,文章和消息)相关联。所有这些关联都基于用户模型存储在用户对象中。我想弄清楚的是,我如何限制API查询的响应来做一些事情,比如创建一个新设备返回系统知道用户的所有内容,因为用户与设备有关。 / p>
创建新设备如下所示:
router.post('/', function(req, res, next) {
var decoded = jwt.decode(req.query.token);
User.findById(decoded.user._id, function(err, doc) {
if (err) {
return res.status(401).json({
title: 'An Error occured',
error: err
});
}
var device = new Device({
model_name: req.body.model_name,
model_number: req.body.model_number,
serial_number: req.body.serial_number,
wwnn: req.body.wwnn,
user: doc
// topic: req.body.topicId // use this line for adding reference IDs if needed
});
console.log(req.body);
console.log(' About to Save Device...');
device.save(function(err, result){
if (err) {
return res.status(404).json({
title: 'An Error occured',
error: err
});
}
doc.devices.push(result);
doc.save();
res.status(201).json({
device: 'Saved Device',
obj: result
});
});
});
});
我的设备型号的架构如下所示:
var schema = new Schema({
model_name: {type: String, required: false},
model_number: {type: String, required: false},
serial_number: {type: String, required: false, unique: true},
wwnn: {type: String, required: false},
user: {type: Schema.Types.ObjectId, ref: 'User'}
});
我的用户模型的架构如下所示:
var schema = new Schema({
password: {type: String, required: true},
email: {type: String, required: true, unique: true},
messages: [{type: Schema.Types.ObjectId, ref: 'Message'}],
articles: [{type: Schema.Types.ObjectId, ref: 'Article'}],
topics: [{type: Schema.Types.ObjectId, ref: 'Topic'}],
profiles: [{type: Schema.Types.ObjectId, ref: 'Profile'}],
devices: [{type: Schema.Types.ObjectId, ref: 'Device'}],
physical_drives: [{type: Schema.Types.ObjectId, ref: 'Physical_drive'}]
});
所以每当我创建一个新设备并返回obj:result时:
res.status(201).json({
device: 'Saved Device',
obj: result
});
我得到回复:其中包含用户配置文件的太多信息,相反,我想限制它只返回用户对象的特定字段。
{
"device": "Saved Device",
"obj": {
"__v": 0,
"model_name": "MyGreatModelName",
"model_number": "MyAwesomeModelNumber",
"serial_number": "MyFantasticSerial2",
"wwnn": "MyWorldWideNode",
"user": {
"_id": "5755e5be96162f52a4f01dd8",
"firstName": "Jason",
"lastName": "Perr",
"password": "sha1$6a807c98$1$2cfa76795b63b23d7ae0fea1715156b3390293b9",
"email": "myGreatEmail@gmail.com",
"__v": 139,
"physical_drives": [
"5761e971e8490444e4b78f23",
"5761eb35a6bfba5ae5ed2db0",
"5761fda47c754be2ebe5276c",
"5761fdd07c754be2ebe5276d"
],
"devices": [
"5761a1933509fb50b7a275cb",
"5761a33deb792d5db85e0f79",
"5761c8ce72318160d2ff99f9",
"5761cc19740a1a0fd4436ee5",
"5761fc1d7c754be2ebe5276a",
"5761fcef7c754be2ebe5276b",
"5762c3417c754be2ebe52774",
"5762c34c7c754be2ebe52775"
],
"profiles": [
"57608d27abcb9ee83dcfe9d3",
"5761875afb99e9b4a91af310",
"57618c3cfb99e9b4a91af311",
"57619bdffb99e9b4a91af313",
"5761afb6ecbd0581c0b95d0d",
"5761bc659084f6ffc803d928",
"5761bf0ac8ae3803cbbaf660",
"5761c073c8ae3803cbbaf664",
"5761c2f56400173cce830cb0",
"5761c8b072318160d2ff99f8"
],
"topics": [
"5755e71696162f52a4f01dde",
"57572d92e802307d199f0afa",
"57572da8e802307d199f0afb"
],
"articles": [
"5755e78a138e28f6a4fd34e7",
"5755ea7e138e28f6a4fd34e8",
"5755f8bddbce43cba958c23f",
"5755f919dbce43cba958c240",
"5755fa5d0a556423acedf0e2",
"5755fbec0a556423acedf0e3",
"5756f65f0a556423acedf0e4",
"5756f6d40a556423acedf0e5",
"57571989ab19798208f4e08e",
"5757198fab19798208f4e08f",
"575881f51ac787521d15ac29",
"575882071ac787521d15ac2a",
"575882dc1ac787521d15ac2b",
"5758b8c11ac787521d15ac36",
"5758b9731ac787521d15ac37",
"5758ba761ac787521d15ac38",
"5758bc391ac787521d15ac39",
"5758bce01ac787521d15ac3a",
"5758bd7e1ac787521d15ac3b",
"5758bdb51ac787521d15ac3c",
"5758be841ac787521d15ac3d",
"5758befd1ac787521d15ac3e",
"5758bfea1ac787521d15ac3f",
"5758c0c31ac787521d15ac40",
"5758c2e173fd33e04092c87e",
"575992d473fd33e04092c87f",
"5759956173fd33e04092c880",
"575995a073fd33e04092c881",
"57599bc573fd33e04092c882",
"57599f4c73fd33e04092c883",
"57599fe673fd33e04092c884",
"5759a07573fd33e04092c885",
"5759aace73fd33e04092c886",
"5759ab2673fd33e04092c887",
"5759ac3c73fd33e04092c888",
"5759acbd73fd33e04092c889",
"5759acdd73fd33e04092c88a",
"5759ad2673fd33e04092c88b",
"5759adc673fd33e04092c88c",
"5759ae6773fd33e04092c88d",
"5759af3b73fd33e04092c88e",
"5759b18073fd33e04092c88f",
"5759b2ad73fd33e04092c891",
"5759b45e73fd33e04092c892",
"5759b4b173fd33e04092c893",
"5759b59a73fd33e04092c894",
"575b6a67dd42b19c39dcfa77",
"575b6f6f03d2aa3d3c3e98f9",
"575b6ffb03d2aa3d3c3e98fa",
"575b70f5874fdbc63d317998",
"575b71c2874fdbc63d317999",
"575b723b874fdbc63d31799a",
"575b7468fd4302593f754eae",
"57606d125b7701e5346075aa",
"57606dba5b7701e5346075ab",
"57606e065b7701e5346075ac",
"57606e835b7701e5346075ad",
"57606edc5b7701e5346075ae",
"57606f1a5b7701e5346075af",
"5761824883f2a99ba5d3b071",
"5761829b83f2a99ba5d3b072",
"57619b8efb99e9b4a91af312"
],
"messages": [
"5755e5da96162f52a4f01dda",
"5755e6db96162f52a4f01ddb",
"5755e6e196162f52a4f01ddc",
"5755e70396162f52a4f01ddd",
"5759b1a973fd33e04092c890"
]
},
"_id": "5762c34c7c754be2ebe52775"
}
}
任何人都知道如何限制这个?理想情况下,我想得到的反应看起来更像是这样:
{
"device": "Saved Device",
"obj": {
"__v": 0,
"model_name": "MyGreatModelName",
"model_number": "MyAwesomeModelNumber",
"serial_number": "MyFantasticSerial2",
"wwnn": "MyWorldWideNode",
"user": {
"_id": "5755e5be96162f52a4f01dd8",
"firstName": "Jason",
"lastName": "Perr",
"__v": 139,
"physical_drives": [
"5761e971e8490444e4b78f23",
"5761eb35a6bfba5ae5ed2db0",
"5761fda47c754be2ebe5276c",
"5761fdd07c754be2ebe5276d"
],
"devices": [
"5761a1933509fb50b7a275cb",
"5761a33deb792d5db85e0f79",
"5761c8ce72318160d2ff99f9",
"5761cc19740a1a0fd4436ee5",
"5761fc1d7c754be2ebe5276a",
"5761fcef7c754be2ebe5276b",
"5762c3417c754be2ebe52774",
"5762c34c7c754be2ebe52775"
],
},
"_id": "5762c34c7c754be2ebe52775"
}
}
答案 0 :(得分:0)
您始终可以创建自定义对象,但这将是一项很多手动工作。但它值得因为网络流量可以带来很大的性能提升。 所以这就是你可以这样做的方式
res.status(201).json({
device: 'Saved Device',
obj: {
Key1 : result.value1,
Key2 : result.value2
}
});
依旧......