node.js - 在 Mongoose 中保存填充值

标签 node.js backbone.js express mongoose marionette

如果我在将文档发送到客户端之前获取并填充它,那么在更新时取消填充这些字段的最佳方法是什么?

架构:

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/

相关文章:

mysql - 如何在 Sails 应用程序中扩展数据库 ORM?

javascript - [Socket.io/Node.js]获取客户​​端连接用户列表

javascript - 更新 mongodb 集合中的字段,即使它不存在

javascript - 主干事件不会在添加到 DOM 的新元素上触发

javascript - 在 Backbone.js 中销毁或删除 View

javascript - 如何等待所有 Promise 在 ExpressJS 中解决?

javascript - Mongoose获取多个集合并进行计算

javascript - 如何在 Nodejs 中提取来自 sql 的结果

javascript - setElement 后 Backbone 事件未委托(delegate)给新元素

javascript - 为什么在express js中间件中调用函数表达式会被提升?