猫鼬计算嵌入式文档数组中的某些元素

Mongoose count certain element in an embedded documents array

我正在使用 mongoose 4.6.3

我有以下架构:

var mongoose = require('mongoose');
var User = require('./User');

var TicketSchema = new mongoose.Schema({
    user : { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
},
{
    timestamps: true
});

var DrawSchema = new mongoose.Schema({
  ...
  max_ticket_per_user : { type : Number, required: true },
  tickets: [TicketSchema]
});

module.exports = mongoose.model('Draw', DrawSchema);

如何统计某个用户ObjectId(TicketSchema中的user字段)在Draw的票(DrawSchema中的tickets字段)中的嵌入文档? 我想计算一次抽奖的用户票数。

改变我的模式设计会更好吗?

谢谢

您可以像传递任何其他查询对象一样传递 .count() 深层参数:

Draw.count({'tickets.user._id' : userId}, console.log);

确保 userId 变量是一个 ObjectId。如果它是一个字符串,这样做:

const ObjectId = require('mongoose').Types.ObjectId;
let userId = new ObjectId(incomingStringId);

您可以使用聚合框架利用 $filter and $size 运算符来获取过滤后的数组,其元素分别与用户 ID 及其大小匹配,随后将给你数。

对于单次绘制,请考虑添加一个 $match 管道运算符作为 _id 查询的初始步骤,以过滤集合中的文档。

考虑运行以下聚合管道以获得所需的结果:

Draw.aggregate([
    { "$match": { "_id": drawId } },
    {
        "$project": {
            "ticketsCount": {
                "$size": {
                    "$filter": {
                        "input": "$tickets",
                        "as": "item",
                        "cond": { "$eq": [ "$$item.user", userId ] }
                    }
                }
            }
        }
    }
]).exec(function(err, result) {
    console.log(result);
});