2014-05-22 2 views
2

저는 Mongo DB를 처음 접했고 집계 교차가 작동하는 데 어려움을 겪고 있습니다.배열 배열에 MongoDB setIntesection

의 나는 단지 컬렉션의 다음 문서가 있다고 가정 해 봅시다 :

{"ids" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] } 

나는 내가 뭘

{"intersection" : [1, 7]} 

를 반환하고 싶습니다 :

db.collection.aggregate([ {$project: {intersection:{$setIntersection:"$ids"}}} ]) 

하지만를 반환 중입니다.

{"intersection" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] } 

"$ ids"는 var-args와는 반대로 int 배열로 해석되기 때문에 가정합니다. 각 arg는 int 배열입니다.

이 아이디어를 얻으려면 어떻게해야할까요?

+0

[1, 7]을 (를) 반환하고 싶습니다. 무엇을 의미합니까? 각 하위 어레이에서 발생하는 요소? –

+0

그래, 모든 하위 배열의 교차점. – dsmith

답변

1

ID 내부의 모든 배열에있는 모든 요소를 ​​찾고 싶습니다.

집합 교차로는 문서의 필드가 아니고 배열 요소이기 때문에 처리 할 수 ​​없으며 프로젝션의 개별 배열 요소를 참조 할 방법이 없습니다. 그럼 어떻게 계산

db.inter.aggregate(
    {$project:{ids:1, sz:{$size:"$ids"}}}, 
    {$unwind:"$ids"}, 
    {$unwind:"$ids"}, 
    {$group:{_id:{_id:"$_id",ids:"$ids"},count:{$sum:1},need:{$first:"$sz"}}}, 
    {$project:{keep:{$eq:["$need","$count"]}}},{$match:{keep:true}},{$sort:{_id:1}}, 
    {$group:{_id:"$_id._id",intersection:{$push:"$_id.ids"}}}, 
    {$project:{ intersection:1}} 
) 

이 배열의 배열이 얼마나 많은 요소 파악과 : 여기

이 필요로 집계의 나머지에 따라 해결 방법 당신이, 또는 작동하지 않을 수있다 각 번호는 풀린 상태로 여러 번 나타납니다. 크기와 같으면 각 하위 요소에 있어야합니다. 그러나 이것은 각 하위 요소가 동일한 수를 두 번 가질 수 없다고 가정합니다.