編輯:這可能是問題與路徑問題。我目前的查詢是這樣的:路由到子文檔與快遞4和貓鼬
router.route('/projects/:project_id/techDetails')
.get(function(req, res) {
Project.findById(req.params.project_Id, function(err, project) {
if (err)
return res.send(err);
res.json(project);
console.log('get success (project techDetails)');
});
});
這會返回null
。儘管除了向路由添加`/ techDetails'之外,它在各種方式中都與代碼的工作線相同。
原題:
我建設有快遞和蒙戈平均棧的應用程序。我無法弄清楚如何正確地路由到嵌套文檔。
這裏是我的項目模式:
const ProjectSchema = new Schema({
idnumber: { type: Number, required: true },
customername: String,
projectdetails: String,
jobaddress: String,
techDetails: [{
scope: String,
edgedetail: String,
lamination: String,
stonecolour: String,
slabnumber: String,
slabsupplier: String,
purchaseordernum: String,
splashbacks: String,
apron: String,
hotplate: String,
sink: String,
sinkdetails: String,
tappos: String
}],
sitecontactname: String,
sitecontactnum: String,
specialreq: String,
install_date: String,
created_on: { type: Date, default: Date.now },
created_by: { type: String, default: 'SYSTEM' },
active: { type: Boolean, default: true },
flagged: { type: Boolean, default: false },
});
我可以與GET
,PUT
和DEL
成功路線/projects
與GET
和POST
和/projects/:project_id
。
使用PUT
路由和項目的_ID我可以將新條目推送到項目的techDetails子數組。所產生的JSON數據看起來是這樣的:
{
"_id": "59e577e011a3f512b482ef13",
"idnumber": 52,
"install_date": "10/20/2017",
"specialreq": "some...",
"sitecontactnum": "987654321",
"sitecontactname": "bill",
"jobaddress": "123 st",
"projectdetails": "some stuff",
"customername": "B Builders",
"__v": 16,
"flagged": false,
"active": true,
"created_by": "SYSTEM",
"created_on": "2017-10-17T03:24:16.423Z",
"techDetails": [
{
"scope": "Howitzer",
"edgedetail": "12mm",
"lamination": "No",
"stonecolour": "Urban™",
"slabnumber": "1",
"slabsupplier": "Caesarstone",
"purchaseordernum": "no",
"splashbacks": "No",
"apron": "No",
"hotplate": "N/A",
"sink": "N/A",
"sinkdetails": "no",
"tappos": "no",
"_id": "59e577e011a3f512b482ef14"
},
{
"scope": "kitchen",
"edgedetail": "12mm",
"lamination": "etc",
"_id": "59e7da445d9d7e109c18f38b"
},
{
"scope": "Vanity",
"edgedetail": "12mm",
"lamination": "No",
"stonecolour": "Linen™",
"slabnumber": "1",
"slabsupplier": "Caesarstone",
"purchaseordernum": "1",
"splashbacks": "No",
"apron": "No",
"hotplate": "N/A",
"sink": "N/A",
"sinkdetails": "no",
"tappos": "woo",
"_id": "59e81e3324fb750fb46f8248"
}//, more entries omitted for brevity
]
}
正如你所看到的一切至今工作正常。但是現在我需要編輯和刪除這個techDetails數組中的單個條目。我還想直接使用projects/:project_id/techDetails
和projects/:project_id/techDetails/:techdetails_id
轉發給他們。
從我可以看到有兩種方法。我可以:
A)使用mergeParams
的techDetails的新路由文件。這是我目前正在嘗試的方法,但是我無法弄清楚如何完成.find
以返回所有techDetails,因爲我只能使用Project
模型模式,並且我不確定如何訪問子文檔。
摘錄從我routes.js:
const techDetails = require('./techDetails');
//other routes here
//see techdetails file
router.use('/projects/:project_id/techdetails', techDetails);
//here lies an earlier, failed attempt
/* router.route('/projects/:project_id/techdetails/:techDetails_id')
.get(function(req, res) {
Project.findById(req.params.project_id.techDetails_id, function(err,
project) {
if (err)
return res.send(err);
res.json(project.techDetails);
console.log('get success (techDetails)');
});
})
; */
和我techdetails.js:
const express = require('express');
const Project = require('./models/project');
const router = express.Router({mergeParams: true});
router.get('/', function (req, res, next) {
/* Project.find(function(err, techDetails) {
if (err)
return res.send(err);
res.json(techDetails);
console.log('get success (all items)');
}); */
res.send('itemroutes ' + req.params);
})
router.get('/:techDetails_id', function (req, res, next) {
res.send('itemroutes ' + req.params._id)
})
module.exports = router
我可以成功地檢查路由與郵差工作,都將獲得響應。現在的問題是,而不是res.send
我想用res.json
與Project.find
(或類似)來獲得techDetails
。
但也有另一種選擇:
B)把techDetails記錄到它自己的架構,然後填充的ID內的項目的數組。
但是,這似乎更復雜,所以我寧願避免這樣做,如果我可以。
歡迎任何想法和建議。讓我知道是否需要更多我的代碼。
因此,您可以定義一個子文檔作爲模式,而不是一個模型?謝謝,這使得選項B的方式更容易。我更喜歡避免使用單獨的控制器,但隨着程序的規模不斷擴大,開始使用它們可能是一個好主意。我會讓你知道,如果我可以得到它的工作!感謝你及時的答覆! – KuroKyo
'response.message = project.techDetails;'返回null和'techDetails'本身返回undefined ...這幾乎是我之前遇到的同樣的問題。我似乎無法訪問嵌套的任何東西。 – KuroKyo
用mongoose.model註冊模式將把techDetails放在一個單獨的集合中(參見[這裏](https://stackoverflow.com/questions/21142524/mongodb-mongoose-how-to-find-subdocument-in-found-document )更多信息)。如果你打算每個項目都有大量的techDetails,那麼這可能是你想要的,因爲techDetails數組會使項目相當大。或者如果你在項目中分享techDetails。否則,我會去沒有一個單獨的集合。 Max BSON文檔大小爲16 MB。 – MikaS