Node.js Mongoose计数嵌入文档数组中的某个元素

Node.js Mongoose计数嵌入文档数组中的某个元素,node.js,mongodb,mongoose,aggregation-framework,mongodb-aggregation,Node.js,Mongodb,Mongoose,Aggregation Framework,Mongodb Aggregation,我正在使用 我有以下模式: 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

我正在使用

我有以下模式:

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);
如何计算抽签的票证(DrawSchema中的票证字段)中某个用户ObjectId(TicketSchema中的用户字段)的嵌入文档? 我想计算一次抽签的用户票数

更改模式设计是否更好


谢谢

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

Draw.count({'tickets.user._id' : userId}, console.log);
确保userId变量是ObjectId。如果是字符串,请执行以下操作:

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

您可以使用聚合框架,利用运算符获得过滤后的数组,其中的元素分别与用户id及其大小匹配,随后将给出计数

对于一个单独的绘图,考虑添加一个<强> <强>流水线运算符作为初始步骤,用Syt 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);
});

这对特定的抽签不起作用。我将尝试添加“_id”:这是一个很好的答案。我得到了我需要的信息,但我只想用一个给定的id聚合一个绘图。作为响应,我得到的是所有绘图id及其用户id计数。我只想在一次抽签中汇总id@AlexB您需要一个$match管道查询来过滤您的文档,正如我在上面的更新中所显示的。FWIW,大多数基于云的Mongodb平台,例如Heroku提供的每个基于云的解决方案,还不支持mongo版本
3.4
,因此
$filter
命令无法工作