【问题标题】:Use Javascript Set as a Mongoose SchemaType?使用 Javascript Set 作为 Mongoose SchemaType?
【发布时间】:2016-09-02 18:27:27
【问题描述】:

由于唯一性,我想使用 ES2015 中标准化的 Javascript 的 Set 作为 Mongoose 中的 SchemaType。但是 Mongoose 文档不明确支持 Set,尽管“混合”类型似乎是一般的“任何事情都可以”类型 (http://mongoosejs.com/docs/schematypes.html)。

我已经根据Thinkster.io 上的 MEAN 堆栈 Reddit/Hacker News 教程在我的网络应用程序中尝试了“混合”,但遇到了错误。我想将所有点击了upvote的用户存储在一个集合中。但只有第一次点击upvote才有效。第一次点赞后,如果页面被刷新,点赞数会重置为0,点赞不再起作用。我做了一些console.logging,发现第一次,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);

【问题讨论】:

    标签: javascript node.js mongodb mongoose set


    【解决方案1】:

    我认为 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来实现。

    【讨论】:

    • 谢谢!您的代码可以工作,但是同时使用 Set 和 Array 并在两者之间来回转换是否会大大降低性能?
    • 性能方面我研究的不多,有没有发现好的文章请指教。顺便问一下,Set#add 在添加 mongoose 对象或 mongoose ObjectId 时是否有效?再次使用相同的upvoter 触发upvote() 时是否存在重复值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多