如果我在将文档发送到客户端之前获取并填充它,那么在更新时取消填充这些字段的最佳方法是什么?
架构:
var User = new mongoose.Schema({
name: String
});
var Post = new mongoose.Schema({
title: String,
likes: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}]
});
Controller :
app.get('/post/:id', function (req, res, next) {
Post.findById(req.params.id).populate('likes').exec(function (err, post) {
if (err) return next(err);
res.json(post);
});
});
app.put('/post/:id', function (req, res, next) {
Post.findById(req.params.id, function (err, post) {
if (err) return next(err);
_.extend(post, req.body);
post.save(function (err) {
if (err) return next(err);
res.json(post);
});
});
});
所以在客户端我收到类似的内容:
{
_id: 123,
title: 'Test post',
likes: [{
_id: 456,
name: 'John Doe'
}, {
_id: 789,
name: 'Max Danger'
}]
}
这一切都很好。但是,当我在客户端修改模型(我使用的是 Backbone.Marionette FWIW),然后将其保存回来时,Mongoose 会抛出 Cast to ObjectId failed for value "[object Object],456"at path "likes"
错误。
我认为 Mongoose 能够自动从这些对象中获取 _id
,但它似乎不是这样工作的..?
那么这里最好的方法是什么?我应该在发送到服务器之前在客户端提取 ID 吗?或者我应该在调用保存之前在服务器上进行提取吗?
此外,保存后我需要重新填充这些字段,然后再将保存的产品发送回客户端,对吧?
最后,我认为我实际上不能使用 Mongoose 的 depopulate()
方法,因为我只是从客户端接收到 JSON,而不是实际的 Model 实例。
有什么帮助吗..?谢谢!
最佳答案
您可以使用node的underscore库来代替mongoose的depopulate()方法,它提供了一个函数pick
并从给定对象返回选择的值并更快地计算结果 here is example !
app.get('/post/:id', function (req, res, next) {
Post.findById(req.params.id).populate('likes').exec(function (err, post) {
if (err) return next(err);
var depopulate = _.pick(post, '_id');
res.json(depopulate);
});
});
depopulate
变量将存储查询结果文档中的 _id
您可以轻松地将所有_id
发送给客户端。
关于node.js - 在 Mongoose 中保存填充值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28576688/