2014-12-05 5 views
1

여기 내 문제 : 나는 단계 '시작'의 총 수를 좀하고 싶습니다

{ 
    'id': 1, 
    'steps': [ 
    { 
     action: 'start', 
     info: 'foo' 
    }, 
    { 
     action: 'stop', 
     info: 'bar' 
    } 
    ] 
} 

: 내 몽고 데이터베이스에, 나는 같은 항목으로 된 컬렉션이 있습니다. MongoDB 집계 프레임 워크를 사용해 보았습니다 : 을 steps.action에, $matchsteps.action으로 'start'와 일치시킵니다.

그러나 데이터가 너무 많아서 집계 한도 인 exception: aggregation result exceeds maximum document size (16MB)에 도달했습니다. 나는 데이터를 필요로하지 않는다, 나는 단지 카운트를 원하지만, 나는 그것을 어떻게 (성공하지 않고 $ 그룹으로 시험해 보았는지) 찾을 수 없었다.

미리 감사드립니다.

답변

8

는이

db.test.count({"steps.action":"start"}) 

를 사용할 수 있지만 단계를 여러 단계를 포함하는 경우이 고려되지 않습니다 당신은

db.obj.aggregate(
[ 
{ $unwind : "$steps"}, 
{$match: { "steps.action" : "start" }}, 
{ 
$group: 
{ 
    _id: null 
    ,count: { $sum: 1 } 
} 
} 
] 
) 

이 출력과 일치 한 후 긴장을 풀고 액션은 start입니다.

start으로 모든 단계를 계산해야하는 경우 배열을 풀고 steps.action에 일치시킨 다음 계산 결과를 그룹화해야합니다.

db.test.aggregate({$unwind:"$steps"}, {$match:{"steps.action":"start"}},{ $group: { _id: null, count: { $sum: 1 } } }) 
+0

그게 시작 카운트 만 제공, 우리는 단일 쿼리에서 시작 및 중지 카운트를 모두 얻을 수 있습니까? – CodecPM

-3

이 간단한 쿼리에는 집계가 필요하지 않을 수 있습니다. 아래 코드를 참조하십시오.

for (var i = 10000; i >= 0; i--) { 
    var a = { 
     'id': 1, 
     'steps': [ 
     { 
      action: 'start', 
      info: 'foo' 
     }, 
     { 
      action: 'stop', 
      info: 'bar' 
     } 
     ] 
    } 

    a.id = i; 
    var rnd = Math.floor((Math.random() * 3) + 1); 
    if (rnd == 1) 
    { 
     a.steps[0].action = 'none'; 
    } 
    if (rnd == 2) 
    { 
     a.steps.push({ action: 'start', info: 'foo' }) 

    } 
    db.obj.insert(a); 
}; 

이 코드는 임의의 수의 작업을 만듭니다. 작업이 포함 된 문서가 필요한 경우 '시작'을 누른 다음 쿼리를 누릅니다.

db.obj.count({"steps.action":"start"}) 

실전에 따라 다음과 같은 결과가 표시됩니다.

> db.obj.count({"steps.action":"start"}) 
6756 

하지만 문서에 {action : 'start'}이 필요하면 집계 쿼리가 필요합니다. 당신이 수를 원하는 경우

{ "_id" : null, "count" : 10054 } 



if you get your exception again use **allowDiskUse : true** option. See [here][1]. 

db.obj.aggregate(
[ 
.... 
] 
, 
{ 
    allowDiskUse : true 
} 

) 
+0

$ $ match 후에 $ unwind는 올바른 계산을 생성하지 않습니다. – Jehof

+0

왜? 먼저 필터링했거나 두 번째로 필터링하면 무엇이 중요합니까? –

+0

원인 $ match는 steps-array의 요소를 줄이지 않고 action = "start"인 배열 요소가있는 요소 만 찾습니다. steps-array에는 이전과 같은 요소가 포함됩니다. – Jehof

2

가 MongoDB를, 통합 프레임 워크에서이

db.collection.aggregate(
    { $unwind : "$steps" }, 
    {$match:{'steps.action':'start'}}, 
    {$group:{_id:null,count:{$sum:1}}} 
).pretty() 
0

시도가 그를 제공하는 결과가 BSON 파일 또는 수집 문서 중 하나가 최대있는 동안, 파이프 라인 단계는 메가 바이트 크기 제한의 최대를 크기가 16MB 이므로 요청 조건 인 경우에만 $match을 입력하고, 결과 결과 만 16MB 미만이되도록 $group을 입력하면됩니다.