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

时间:2015-10-31 03:12:18

标签: node.js mongodb mongoose

我有这个Mongoose架构:

var postSchema = mongoose.Schema({

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

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

});

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

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

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

4 个答案:

答案 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