2011-09-25 5 views
1

저는 Mongo 초보자이며이 스키마를 작동 시키려고합니다.

트래픽이 많은 웹 사이트에서 발생하는 이벤트를 기록하기위한 것으로, 특정 동작이 발생하는 횟수를 늘리는 것입니다.

{ 
    _id: "20110924", 
    Vals:[ 
     { Key: "SomeStat1": Value: 1}, 
     { Key: "SomeStat2": Value: 2}, 
     { Key: "SomeStat3": Value: 3} 
    ] 
    } 
    , 
    { 
    _id: "20110925", 
    Vals:[ 
     { Key: "SomeStat1": Value: 3}, 
     { Key: "SomeStat8": Value: 13}, 
     { Key: "SomeStat134": Value: 63} 
    ] 
    }, etc. 

여기 _id는 날짜이며, 다른 통계의 배열과 발생한 횟수입니다. 이 날에는 통계가 없으며 통계 키는 동적 일 수 있습니다.

저는 이러한 업데이트를 달성하기위한 가장 효율적인 방법을 찾고 있으며, 경쟁 조건을 피하고 있습니다. 이상적인 모든 원자력입니다.

$ inc를 시도 할 때 막혔어요. 내가 upsert해야 지정하면 전체 문서를 조건부로 일치 시키려고하고, 중복 키에 실패합니다. $ addToSet에 대해서도 마찬가지로 - {Key : "SomeStat1"}을 사용하여 addToSet을 실행하면 전체 문서와 일치하므로 중복되지 않는다고 간주되어 기존의 SomeStat1 값과 함께 삽입됩니다.

가장 좋은 방법은 무엇입니까? $ addToSet이 일치하는 방법을 제어 할 수있는 방법이 있습니까? 아니면 다른 스키마가 필요합니까?

미리 감사드립니다.

답변

0

잘못된 스키마를 사용하고 있습니다. 원자 적 업데이트를 수행하는 것은 불가능합니다.

{ 
    _id: "20110924", 
    Vals: { 
    SomeStat1: 1, 
    SomeStat2: 2, 
    SomeStat3: 3, 
    } 
} 

하거나 Vals 하위 문서를 건너 뛰고 주요 문서의 통계를 포함 할 수 있습니다 : 이런 식으로 작업을 수행합니다.

+0

그게 유효한 json이라고 생각하지 않습니까? – Nik

+0

문제점 주요 문서에 임베딩 할 때 강하게 유형화 된 클래스 (C# 드라이버) 로의 직렬화가 불가능하다고 생각합니다. – Nik

+0

opp 죄송합니다. 나는 항상 당신이 C# 드라이버로 deserialize해야한다고 생각하지 않는다. 확실한 해결 방법이있다. –

0

MongoDB C# 드라이버를 사용하여 사전을 직렬화하는 문제를 설명하는 this article을 살펴보십시오. C# 드라이버의 this work item도 참조하십시오.

+0

"중첩 된 배열은 mongo에서 잘 지원되는 구조가 아니며 사전 지속성을 위해이를 사용하면 매우 제한적입니다. 검색, 색인 및 원자 적 업데이트 기능이 손실됩니다." - thx, 그게 내 포인트 야. 스키마가 원자 적 업데이트에 적합하지 않다는 걸 증명할 뿐이야. 그 배열은 실제로 의미가 없습니다. 이런 종류의 저장을 위해서는 사전이 정말로 필요합니다. C# 드라이버가 정말 그렇게 나쁜가요? Python, Ruby 및 PHP 드라이버는 모두 임의의 데이터를 저장 및 검색 할 수 있습니다. –

+0

최신 C# 드라이버에는이 문제를 해결하기위한 새로운'DictionarySerializationOptions' 옵션이 있습니다. –

+0

@Hightechrider를 참조 해 주셔서 감사합니다. – Nik

관련 문제