猫鼬 - 获取模型中的数组长度

Ale*_*lls 7 mongoose mongodb node.js

我有这个Mongoose架构:

var postSchema = mongoose.Schema({

    postId: {
        type: Number,
        unique: true
    },

    upvotes: [
        {
            type: Number,
            unique: true
        }
    ]

});
Run Code Online (Sandbox Code Playgroud)

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

真的很难在网上找到这个信息 - 我搜索的所有内容都提到了我认为不需要的聚合方法.

另外,作为旁注,upvotes数组的唯一模式属性不起作用,也许我做错了.

Joh*_*yHK 9

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

Post.aggregate([{$match: {postId: 5}}, {$project: {upvotes: {$size: '$upvotes'}}}])
Run Code Online (Sandbox Code Playgroud)

1 单个异常是$meta投影操作符,用于投影$text查询结果的分数.

  • 但是``Aggregation``返回JSON对象而不是``Model``对象。因此,我们无法对返回的文档执行任何操作。还有其他方法吗? (2认同)

Rya*_*ell 6

我通常不喜欢缓存值,但是可以选择(在找到此stackoverflow答案后,我将针对用例进行处理)以在更新记录时计算字段的长度pre('validate')挂钩。例如:

var schema = new mongoose.Schema({
    name: String,
    upvoteCount: Number,
    upvotes: [{}]
});

schema.pre('validate', function (next) {
  this.upvoteCount = this.upvotes.length
  next();
});
Run Code Online (Sandbox Code Playgroud)

只需注意,您需要通过使用find加载对象然后使用保存更改的方式以猫鼬方式进行更新object.save()-请勿使用findOneAndUpdate