由于独特性,我想在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);
答案 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
来实现此目的。