mongoose – 在模型中获得数组的长度

我有这个mongoose纲要:

var postSchema = mongoose.Schema({ postId: { type: Number, unique: true }, upvotes: [ { type: Number, unique: true } ] }); 

什么是最好的查询来获得upvotes数组的长度? 我不相信我需要使用聚合,因为我只想查询一个模型,只需要给定模型upvotes数组的长度。

真的很难在网上find这个信息 – 我search的所有东西都提到了我不认为需要的聚合方法。

另外,作为一个方面说明,upvotes数组的唯一模式属性不起作用,也许我做错了。

find结果只能包含文档本身的内容1 ,而aggregate可以投影从文档内容(如数组长度)派生的新值。 这就是为什么你需要使用aggregate ,即使你只得到一个单一的文档。

 Post.aggregate([{$match: {postId: 5}}, {$project: {upvotes: {$size: '$upvotes'}}}]) 

1 单一的例外是$meta投影运算符来投影$text查询结果的分数。

我通常不是caching值的粉丝,但它可能是一个选项(并find这个stackoverflow的答案是我要为我的用例做)来计算logging更新时的字段长度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()来保存更改来更新mongoose的方式 – 不要使用findOneAndUpdate

我的build议是拉动整个upvotes字段数据,并在node.js代码中使用返回数组的.length属性

 //logic only, not a functional code post.find( filterexpression, {upvote: 1}, function(err, res){ console.log(res.upvotes.length); }); 

编辑:

其他的做法是存储Javascript。 您可以使用.length查询upvote并在mongodb边存储的Javascript中统计相同的值