使用Javascript设置为Mongoose SchemaType?

时间:2016-09-02 18:27:27

标签: javascript node.js mongodb mongoose set

由于独特性,我想在ES2015中使用Javascript标准集作为Mongoose中的SchemaType。但是Mongoose的文档并没有明确地支持Set,尽管看起来好像是#34;混合"类型是一般的"任何事情都是"输入(http://mongoosejs.com/docs/schematypes.html)。

我已尝试过"混合"在我的网页应用程序基于Thinkster.io的MEAN堆栈Reddit / Hacker新闻教程,但遇到了错误。我想存储在Set中点击upvote的所有用户。但只有第一次点击upvote工作。在第一次单击upvote后,如果刷新页面,则upvote计数将重置为0并且单击upvote不再有效。我做了一些console.logging,发现第一次,upvoters被正确设置为一个新的Set()。但刷新页面或随后点击upvote会将set对象重置为更通用的[object Object],因此set的add和length不起作用。谢谢你的帮助!

Posts.js:

    var mongoose = require('mongoose');

    var PostSchema = new mongoose.Schema({
      title: String,
      link: String,
      upvotes: {type: Number, default: 0},
      comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }],
      author: String,
      upvoters: Object
    });

    PostSchema.methods.upvote = function(cb, upvoter) {          
      if(this.upvoters == null){
        this.upvoters = new Set();
      }
      this.upvoters.add(upvoter);
      this.markModified('upvoters');
      this.upvotes = this.upvoters.length;
      this.save(cb);
    };
    mongoose.model('Post', PostSchema);

1 个答案:

答案 0 :(得分:1)

我认为Object不是mongoose中的有效方案类型。

此外,ES6中的Set更像Array而不是Object

尝试将upvoters的架构类型更改为[{type : mongoose.Schema.Types.ObjectId, ref : 'User'}]

如果它也不起作用,我认为你最好将new Set()初始化为变量而不是直接分配给mongoose模型对象,例如:(未测试)

PostSchema.methods.upvote = function(cb, upvoter) { 
  var upvoters = new Set(this.upvoters);
  upvoters.add(upvoter);
  this.upvoters = Array.from(upvoters);
  this.markModified('upvoters');
  this.save(cb);
};

此外,我建议您删除属性upvotes,因为其值应始终等于upvoters.length,您可以考虑使用Schema.virtual来实现此目的。