【问题标题】:Adding Properties in a forEach Loop in Mongoose在 Mongoose 的 forEach 循环中添加属性
【发布时间】:2013-07-31 01:00:43
【问题描述】:

假设我的帖子数组中的每个帖子都有两个属性名称和编号。所以它就像

var posts = [{name:"hey", number: 1}, {name:"foo", number:"2"}]

Javascript 允许我像这样在 foreach 循环中更改这些属性:

posts.forEach(function(post){
    post.name = "bar"
});

我的数组变成:

var posts = [{name:"bar", number: 1}, {name:"bar", number:"2"}]

但它不允许我添加新属性,例如:

posts.forEach(function(post){
    post.adress = "bar"
});

我的对象保持不变。有没有办法在 javascipt 的 foreach 循环中添加属性

编辑:

这是在回调中使用猫鼬发生的..

  Post.pagination(options, function(err, posts) {
    if (err) console.log(err)
    posts.forEach(function(post){
      post.votetype = 1;
    });
    console.log(posts);
    res.send({ posts : posts  })
  })

在没有添加这个 votetype 属性之后

【问题讨论】:

  • 你确定吗?我得到了你想要的结果:jsfiddle.net/dAHJz。查看控制台并展开数组(及其对象),您会看到 address 属性已添加到每个
  • 这是在浏览器中还是在服务器端使用 Node.js 和 Mongoose(或类似的东西)?
  • 使用猫鼬.. 我想我的问题过于简单了
  • 然后你需要在特定对象上调用.toObject(),然后你会得到一个你可以修改的对象。

标签: javascript mongoose


【解决方案1】:

问题是从 Mongoose 返回的数据是不可变的。 下面的代码未经测试,但应该会提示您如何使数据可变并对其进行修改。

关键是在你想修改的 Mongoose 文档对象上调用toObject()

Post.pagination(options, function(err, posts) {
  if (err) console.log(err);

  var resultPosts = posts.map(function(post) {
    var tmpPost = post.toObject();

    // Add properties...
    tmpPost.votetype = 1;

    return tmpPost;
  });

  console.log(resultPosts);
  res.send({ posts : resultPosts  });
});

【讨论】:

  • @GorkemYurtseven 很高兴我能帮上忙。几周前我遇到了完全相同的问题。 :)
  • 谢谢我不知道猫鼬中的不可变对象。这也解决了我的问题!每天学习!
  • 另外,如果你有一个来自猫鼬的文档并且不会将它保存回数据库(并且想要添加属性),请在查询中使用 .lean() : mongoosejs.com/docs/api.html#query_Query-lean
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2016-12-28
  • 2012-11-14
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多