使用Javascript Set作为Mongoose SchemaType
Use Javascript Set as a Mongoose SchemaType?
由于唯一性,我想使用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
来实现这一点。
- 使用promise和mongoose对文档进行排序
- 如何缩短MongoDB ObjectId并在Mongoose模式中使用它
- mongoose.connect undefined不是一个函数
- Mongoose-在更新中删除数组元素
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- Mongoose TypeError:实例化模式类型的对象时,对象不是函数
- 预保存钩子:mongoose中回调的顺序如何
- Mongoose传递类函数
- 将mongoose javascript代码转换为typescript.此引用丢失
- Mongoose查询嵌套文档的时间或多或少为某个日期
- Node.js和Mongoose返回2D查询
- 从Mongoose结果匿名函数返回父函数
- 返回一个关联数组,而不是mongoose中的文档数组
- Mongoose从查询中设置本地变量
- Mongoose查询在两个日期时间之间提取数据
- Mongoose响应解析不正确
- Mongoose:布尔型'或者'使用通配符查询
- 为什么我的Mongoose findAll方法返回500错误.
- 使用mongoose将数据推送到mongoDB模式中的数组中
- 使用Javascript Set作为Mongoose SchemaType