我有这个Mongoose架构:
var postSchema = mongoose.Schema({
postId: {
type: Number,
unique: true
},
upvotes: [
{
type: Number,
unique: true
}
]
});
用于获取upvotes数组长度的最佳查询是什么?我不相信我需要使用聚合,因为我只想查询一个模型,只需要给定模型的upvotes数组的长度。
真的很难在网上找到这些信息 - 我搜索的所有内容都提到了我不相信我需要的聚合方法。
另外,作为旁注,upvotes数组的唯一架构属性不起作用,也许我做错了。
答案 0 :(得分:6)
find
结果只能包含来自文档本身 1 的内容,而aggregate
可以投影从doc的内容派生的新值(如数组的长度)。这就是为什么你需要使用aggregate
,即使你只获得一个文档。
Post.aggregate([{$match: {postId: 5}}, {$project: {upvotes: {$size: '$upvotes'}}}])
1 单个例外是$meta
投影运算符,用于投影$text
查询结果的分数。
答案 1 :(得分:4)
我通常不是缓存值的粉丝,但它可能是一个选项(并且在找到此stackoverflow答案是我将要为我的用例做的事情之后)计算的长度在pre(' validate')挂钩中更新记录时的字段。例如:
var schema = new mongoose.Schema({
name: String,
upvoteCount: Number,
upvotes: [{}]
});
schema.pre('validate', function (next) {
this.upvoteCount = this.upvotes.length
next();
});
请注意,您需要通过使用find加载对象然后使用object.save()
保存更改来使用猫鼬方式进行更新 - 不要使用findOneAndUpdate
答案 2 :(得分:1)
我的建议是在node.js代码中提取整个upvotes字段数据并使用返回数组的.length属性
//logic only, not a functional code
post.find( filterexpression, {upvote: 1}, function(err, res){
console.log(res.upvotes.length);
});
编辑:
其他的做法是存储Javascript。你可以查询 upvote和计数相同的mongodb侧存储Javascript使用 。长度
答案 3 :(得分:1)
postSchema.virtual('upvoteCount').get(function () {
return this.upvotes.length
});
let doc = await Post.findById('foobar123')
doc.upvoteCount // length of upvotes