使用 Mongoose 对嵌套模式进行 CRUD
CRUD on nested schemas using Mongoose
我正在尝试使用 Mongoose 为 mongodb 子文档设置带有 CRUD 的 nodejs 应用程序,但无法弄清楚如何访问嵌套对象的 _id。我只能获取父 ObjectId。我可以对新的子对象执行 .push,但不能对现有的子对象执行简单的获取、放置或删除。
这是我的架构:
//new user model
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
// Task schema
var taskSchema = mongoose.Schema({
clientEasyTask : { type: String },
clientHardTask : { type: String },
clientStupidTask : { type: String }
});
var userSchema = new mongoose.Schema({
email: { type: String, unique: true, lowercase: true },
password: String,
task : [taskSchema]
});
module.exports = mongoose.model('Task', taskSchema);
module.exports = mongoose.model('User', userSchema);
这是我的路线:
'use strict';
var isAuthenticated = require('./middleware/auth').isAuthenticated,
isUnauthenticated = require('./middleware/auth').isUnauthenticated;
var User = require('./models/user');
var Task = require('./models/user');
// Create user.task
module.exports = function (app, passport) {
app.post('/api/tasks', isAuthenticated, function (req, res) {
var userEmail = req.body.email;
var easyTask = req.body.easyTask;
User.findOne({ 'email' : userEmail }, function(err, user) {
console.log('found user and defining status and data');
var status;
var data;
if (err) {
status = 'error';
data = 'unknown error occurred';
}
if (user === null) {
status = 'error';
data = 'user not found';
} else {
status = 'ok';
data = user;
}
user.task.push({
clientEasyTask: easyTask
});
user.save();
res.json({
response: {
'status': status
}
});
});
});
// Get one user.task
app.get('/api/tasks/:id', function (req, res) {
return Task.findById(req.params.id, function(err, task) {
if(!task) {
res.statusCode = 404;
return res.send({ error: 'Not found' });
}
if(!err) {
return res.send({ status: 'OK', task:task });
} else {
res.statusCode = 500;
console.log('Internal error(%d): %s', res.statusCode, err.message);
return res.send({ error: 'Server error' });
}
});
});
};
我正在使用 Postman 测试所有内容,因此没有前端代码。当我传递任务的 _id(嵌套在用户中)时,我在调用“/api/tasks/:id”上的 Get 时收到 null。我怎样才能只得到特定的任务?
猫鼬文档说明您可以使用 parent.children.id(id);但我无法让它工作。
User
的 task
字段包含作为嵌入式子文档的任务,而不是对另一个集合的引用,因此您不能独立于用户查询任务(就像您尝试做的那样) .
要查询嵌入式任务子文档,您可以使用这样的查询:
User.findOne({'task._id': req.params.id})
.select('task.$') // Just include the matching task element
.exec(function(err, user) {
if(!user) {
res.statusCode = 404;
return res.send({ error: 'Not found' });
}
if(!err) {
// The matching task will always be in the first element of the task array
return res.send({ status: 'OK', task: user.task[0] });
} else {
res.statusCode = 500;
console.log('Internal error(%d): %s', res.statusCode, err.message);
return res.send({ error: 'Server error' });
}
}
);
为了提高效率,您需要在 {'task._id': 1}
上添加索引。
我正在尝试使用 Mongoose 为 mongodb 子文档设置带有 CRUD 的 nodejs 应用程序,但无法弄清楚如何访问嵌套对象的 _id。我只能获取父 ObjectId。我可以对新的子对象执行 .push,但不能对现有的子对象执行简单的获取、放置或删除。
这是我的架构:
//new user model
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
// Task schema
var taskSchema = mongoose.Schema({
clientEasyTask : { type: String },
clientHardTask : { type: String },
clientStupidTask : { type: String }
});
var userSchema = new mongoose.Schema({
email: { type: String, unique: true, lowercase: true },
password: String,
task : [taskSchema]
});
module.exports = mongoose.model('Task', taskSchema);
module.exports = mongoose.model('User', userSchema);
这是我的路线:
'use strict';
var isAuthenticated = require('./middleware/auth').isAuthenticated,
isUnauthenticated = require('./middleware/auth').isUnauthenticated;
var User = require('./models/user');
var Task = require('./models/user');
// Create user.task
module.exports = function (app, passport) {
app.post('/api/tasks', isAuthenticated, function (req, res) {
var userEmail = req.body.email;
var easyTask = req.body.easyTask;
User.findOne({ 'email' : userEmail }, function(err, user) {
console.log('found user and defining status and data');
var status;
var data;
if (err) {
status = 'error';
data = 'unknown error occurred';
}
if (user === null) {
status = 'error';
data = 'user not found';
} else {
status = 'ok';
data = user;
}
user.task.push({
clientEasyTask: easyTask
});
user.save();
res.json({
response: {
'status': status
}
});
});
});
// Get one user.task
app.get('/api/tasks/:id', function (req, res) {
return Task.findById(req.params.id, function(err, task) {
if(!task) {
res.statusCode = 404;
return res.send({ error: 'Not found' });
}
if(!err) {
return res.send({ status: 'OK', task:task });
} else {
res.statusCode = 500;
console.log('Internal error(%d): %s', res.statusCode, err.message);
return res.send({ error: 'Server error' });
}
});
});
};
我正在使用 Postman 测试所有内容,因此没有前端代码。当我传递任务的 _id(嵌套在用户中)时,我在调用“/api/tasks/:id”上的 Get 时收到 null。我怎样才能只得到特定的任务?
猫鼬文档说明您可以使用 parent.children.id(id);但我无法让它工作。
User
的 task
字段包含作为嵌入式子文档的任务,而不是对另一个集合的引用,因此您不能独立于用户查询任务(就像您尝试做的那样) .
要查询嵌入式任务子文档,您可以使用这样的查询:
User.findOne({'task._id': req.params.id})
.select('task.$') // Just include the matching task element
.exec(function(err, user) {
if(!user) {
res.statusCode = 404;
return res.send({ error: 'Not found' });
}
if(!err) {
// The matching task will always be in the first element of the task array
return res.send({ status: 'OK', task: user.task[0] });
} else {
res.statusCode = 500;
console.log('Internal error(%d): %s', res.statusCode, err.message);
return res.send({ error: 'Server error' });
}
}
);
为了提高效率,您需要在 {'task._id': 1}
上添加索引。