猫鼬计算嵌入式文档数组中的某些元素
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);
});
我正在使用 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);
});