使用Javascript Set作为Mongoose SchemaType

Use Javascript Set as a Mongoose SchemaType?

本文关键字:Mongoose SchemaType 作为 Set Javascript 使用      更新时间:2023-09-26

由于唯一性,我想使用Javascript在ES2015中标准化的Set作为Mongoose中的SchemaType。但是Mongoose文档不显式地支持Set,尽管"Mixed"类型似乎是一种通用的"任意"类型(http://mongoosejs.com/docs/schematypes.html)。

我已经尝试了"混合"在我的web应用程序基于MEAN stack Reddit/黑客新闻教程在Thinkster。但是遇到了一些bug。我想将所有点击upvote的用户存储在一个集合中。但只有第一次点击"向上投票"才有效。第一次点击upvote后,如果页面刷新,upvote计数重置为0,点击upvote不再起作用。我做了一些控制台。日志记录并发现第一次将upvoters正确地设置为新的set()。但是刷新页面或随后点击upvote将set对象重置为更一般的[object object],因此set的添加和长度不起作用。谢谢你的帮助!

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);

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

同时,ES6中的Set更像Array而不是Object

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

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

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来实现这一点。