[英]MongoDB: Count of matching array elements
我有一個名為“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,
},
...
]
},
...
我需要的是算在這些數組的元素數量符合一定的條件,比如,我想在每一個元素計數SSCCANCELATIONS
,但我只想計算SSCEXPEND
與元素Title = 1, and SSCVALIDATIONS elements with Result < 10
我可以得到每個數組的元素總數
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
},
最后,我需要對Line
和LineStart
的結果進行LineStart
,但我想我已經擁有了其他所有內容(我從日期中得到的日期減去了小時,分鍾......)。
所以我唯一需要知道的是如何只計算我真正想要的數組元素。
我讀過有關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 ]}
}
}
}
}
}
])
然后簡單地讓你的$ group獲得所有SSCEXPEND,SSCCANCELATIONS等的總和......
使用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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.