2016-10-30 8 views
1

두 개의 속성을 가진 MongoDB 컬렉션이 있습니다 : & 값입니다.각 MongoDB 집합 그룹의 예제를 얻으십시오

[ 
    {type: "A", value: "1"}, 
    {type: "A", value: "2"}, 
    {type: "B", value: "1"}, 
    {type: "B", value: "2"}, 
    {type: "C", value: "1"}, 
    {type: "C", value: "2"} 
] 

나는 하나의 쿼리를 사용하여 각 유형 중 하나를 무작위로 문서를 얻을 수있는 방법 ?

나는 각 그룹에 샘플링을 적용하지만, 단순히 그룹 중 하나를 선택하지 않는 통합 프레임 워크

db.collection.aggregate([ 
    {$group: {_id: "$type", item: {$push: "$$ROOT"}}}, 
    {$sample: {size: 1}} 
]); 

를 사용하여 뭔가를 알아 내기 위해 노력했다.

답변

1

또는, $sample보다 다른 방법으로 임의의 모든 그룹화 요소를 반복하고 처리 할 수 ​​있습니다 : Getting a random value from a JavaScript array

하는이 솔루션은 느린 될 수 있습니다

db.collection.aggregate([ 
    { $group: { _id: "$type", item: { $push: "$$ROOT" } } } 
]).forEach(function(data) { 
    var rand = data.item[Math.floor(Math.random() * data.item.length)]; 
    // insert in a new collection if needed 
    // db.results.insert(rand); 
    printjson(rand); 
}); 

는 배열에서 임의의 요소를 선택하기 컬렉션에 큰 고유 값이 type 인 경우 집계를 사용하지 않습니다.

+0

내가하지 쿼리 결과를 처리하여, 독점적으로 쿼리에서이를 싶습니다 약간의 여분의 코드. – Mouz

0

찾고있는 것을 달성했는지는 확실하지 않지만 어디서든 내 기준에 맞는 데이터 그룹을 찾아 무작위 샘플을 얻어야하는 비슷한 일을하려고합니다.

나는 아래의 라인을 따라,이 현재 사용 $ 일치와 $ 샘플을 acheive 할 수 있었다 :

db.collection('collectionname').aggregate(
{$match : {'type': 'B'}}, 
{$sample: {size: 1}} 
); 
+0

이 형식은 B 유형 객체의 샘플 만 반환하며 각 유형의 샘플은 반환하지 않습니다. – Mouz