MongoDB:匹配数组元素的计数



我有一个名为"Lines"的集合,具有以下结构(基本上,我有很多文档包含几个数组,我需要用条件来计算它们的元素)。

{
"_id" : "201503110040020021",
"Line" : "1", // several documents may have this Line value
"LineStart" : ISODate("2015-03-11T06:49:35.000Z"),
"SSCEXPEND" : [ 
{
"Secuence" : 10,
"Title" : 1,
}, 
{
"Secuence" : 183,
"Title" : 613,
}, 
...
],
"SSCCANCELATIONS" : [ 
{
"Secuence" : 34,
"Title" : 113,
}, 
{
"Secuence" : 96,
"Title" : 2,
}, 
... 
],
"SSCVALIDATIONS" : [ 
{
"Secuence" : 12,
"Result" : 1
}, 
{
"Secuence" : 15,
"Result" : 1,
},
{
"Secuence" : 18,
"Result" : 20,
},
...
]
},
...

我需要的是计算这些数组中有多少元素符合某些条件,例如,我想数数CCD_ 1中的每个元素,但我只想用Title = 1, and SSCVALIDATIONS elements with Result < 10计数SSCEXPEND元素

我可以通过获得每个数组的元素总数

db.Lines.aggregate( { $project: { Line : 1, Validations: { $size: "$SSCVALIDATIONS" }, ... } } ) 

但我需要稳定条件,才能得到这样的东西:

{
"_id" : "201503110040020021",
"Line" : "1",
"LineStart" : ISODate("2015-03-11T06:49:35.000Z"),
"SSCEXPEND" : 15,
"SSCCANCELATIONS" : 10,
"SSCVALIDATIONS" : 462
},

最后,我需要对LineLineStart的结果进行分组,但我想我已经拥有了其他所有内容(我从我拥有的日期中得到了减去小时、分钟…的日期)。

所以我唯一需要知道的是如何只计算我真正想要的数组元素。

我读过db.collection.group()

但是我发现db.collection.group()方法不适用于分片集群,所以我不能使用它

我也读过这个老问题:MongoDB:匹配的嵌套数组元素计数这或多或少是一样的,但它在大约五年前就得到了答案,当时的答案是没有直接的方法,所以我在问,以防现在有办法。

带有展开的方法占用了大量资源。当你可以时,直接使用项目

db.c.aggregate([
{
$project: {
_id: 1,
Line: 1,
LineStart:1,
SSCEXPEND: {
$size: {
$filter: {
input: "$SSCEXPEND",
as: "e",
cond:{ $eq: [ "$$e.Title", 1 ]}
}
}
},
SSCCANCELATIONS: {
$size: "$SSCCANCELATIONS"
},
SSCVALIDATIONS:{
$size: {
$filter: {
input: "$SSCVALIDATIONS",
as: "v",
cond: {$lt: [ "$$v.Result", 10 ]}
}
}
}
}
}
])

然后只需放入您的$组即可获得所有SSCEXPEND、SSCCANCELTIONS等的总和…

使用mongo聚合,您可以找到计数,查看下面的聚合查询

db.Lines.aggregate([
{
"$unwind": "$SSCEXPEND"
},
{
"$unwind": "$SSCVALIDATIONS"
},
{
"$match": {
"$and": [
{
"SSCEXPEND.Title": 1
},
{
"SSCVALIDATIONS.Result": {
"$gt": 10
}
}
]
}
},
{
"$group": {
"_id": "$_id",
"SSCEXPEND": {
"$addToSet": "$SSCEXPEND"
},
"SSCVALIDATIONS": {
"$addToSet": "$SSCVALIDATIONS"
},
"SSCCANCELATIONS": {
"$first": "$SSCCANCELATIONS"
}
}
},
{
"$project": {
"SSCEXPENDCOUNT": {
"$size": "$SSCEXPEND"
},
"SSCVALIDATIONSCOUNT": {
"$size": "$SSCVALIDATIONS"
},
"SSCCANCELATIONSCOUNT": {
"$size": "$SSCCANCELATIONS"
}
}
}
]).pretty()

最新更新