2013-03-06 1 views
4

내가 작업해온 MongoDB를 설명하는 "스키마"(quelle horreur)를 준비 중입니다.모든 키에 걸친 고유 Mongo DB 값의 계수, 계수

모든 키 목록을 만들고 각 키의 적용 범위를 표시하는 데 우수 variety.js을 사용했습니다. 그러나 키에 해당하는 값의 값이 작은 경우 전체 집합을 "사용 가능한 값"으로 나열 할 수 있어야합니다. R에서는 범주 형 변수, 즉 성별 : [ "M", "F"]의 "요인"으로 생각할 것입니다.

나는 R + RMongo를 사용하여 각 변수를 쿼리 할 수 ​​있으며 기본적으로 히스토그램을 만들 때와 동일한 절차를 수행하지만 적절한 Mongo.query()/javascript/Map을 알고 싶습니다. 이것에 접근하는 방법을 줄입니다. 나는 db.collection.aggregate() 함수가 정확히 이것을 위해 설계되었다는 것을 이해합니다.

이 요청하기 전에, 나는 참조 :

니어 파이프 라인 주문을 제대로받을 수 없습니다. 나는이 같은 문서가 경우에 따라서, 예를 들면 : 카운트로,

{"key1" : ["value1", "value2"]} 
{"key2" : ["value3"]} 

또는 더 나은 :

{_id : 1, "key1" : "value1", "key2": "value3"} 
{_id : 2, "key1" : "value2", "key2": "value3"} 

을 내가 좋아하는 뭔가를 반환하고 싶습니다

{"key1" : ["value1" : 1, "value2" : 1]} 
{"key2" : ["value3" : 2]} 

내가 인식 이를 수행 할 때의 한 가지 문제점은 광범위한 값 (예 : 텍스트 필드 또는 연속 변수)을 갖는 값입니다. 이상적으로, 가능한 다른 값이 x보다 많으면 잘라내는 것이 좋으며 20 개 이상의 고유 한 값을 사용하지 않는 것이 좋습니다. 실제로 더 많은 것이 발견되면 해당 변수를 직접 쿼리합니다.

db.collection.aggregate(
    {$limit: 20, 
    $group: { 
     _id: "$??varname", 
     count: {$sum: 1} 
    }}) 

첫째, 어떻게? varname에 참조 할 수 있습니다

:

같은이 뭔가인가? 각 열쇠의 이름은?

나는 95 그 % 있었다이 링크를 보았다와 Binning and tabulate (unique/count) in Mongo

...을

input data: 

{ "_id" : 1, "age" : 22.34, "gender" : "f" } 
{ "_id" : 2, "age" : 23.9, "gender" : "f" } 
{ "_id" : 3, "age" : 27.4, "gender" : "f" } 
{ "_id" : 4, "age" : 26.9, "gender" : "m" } 
{ "_id" : 5, "age" : 26, "gender" : "m" } 

이 스크립트 :

db.collection.aggregate(
    {$project: {gender:1}}, 
    {$group: { 
     _id: "$gender", 
     count: {$sum: 1} 
    }}) 

가 생산 :

{"result" : 
    [ 
    {"_id" : "m", "count" : 2}, 
    {"_id" : "f", "count" : 3} 
    ], 
    "ok" : 1 
} 

하지만 이해할 수없는 것은 어떻게 잠재적으로 많은 수의 반환 값을 가진 알 수없는 숫자/이름의 키에 대해 일반적으로이 작업을 수행 할 수 있습니까? 이 샘플은 키 이름이 성 (gender)이고 응답 세트가 작음 (2 값)임을 알고 있습니다.

+0

{ "value1", "value2"}}}은 (는) 유효한 JSON이 아닙니다. 모든 배열에는 이름이 있어야합니다. 이 코드에서 key1은 이름이없는 배열을 포함하는 Object의 이름입니다. 가장 올바른 방법은 배열에 이름을 지정하는 것입니다. { "key1": {anArray : [ "value1", "value2"]}} –

+1

그래, 한 단계 중첩을 제거했습니다. 감사. – Mittenchops

+0

모든 필드가 최상위 단순 필드라고 가정합니까? 배열이나 내장 된 json 문서에 대해 걱정하지 않습니까? –

답변

1

컬렉션의 모든 키 이름을 출력하는 스크립트를 이미 실행 한 경우에는 집계 프레임 워크 파이프 라인을 동적으로 생성 할 수 있습니다. 즉, variety.js 유형 스크립트를 확장하거나 직접 작성하는 것입니다.

"키"라는 배열에 여러 "- id"라는 이름의 필드가있는 경우 JS에서와 같이 보일 수 있습니다 (최상위 필드를 가정하고 배열에 신경 쓰지 않습니다. 문서 등).

keys = ["key1", "key2"]; 
group = { "$group" : { "_id" : null } } ; 
keys.forEach(function(f) { 
    group["$group"][f+"List"] = { "$addToSet" : "$" + f }; }); 
db.collection.aggregate(group); 
{ 
    "result" : [ 
     { 
      "_id" : null, 
      "key1List" : [ 
       "value2", 
       "value1" 
      ], 
      "key2List" : [ 
       "value3" 
      ] 
     } 
    ], 
    "ok" : 1 
}