2016-09-05 2 views
0

MongoDB를 사용하여 실시간 데이터 시리즈 성능을 테스트하고 싶지만 문서를 업데이트하는 중에 문제가 발생합니다.문서 C#의 MongoDB 자동 증가 키

나는 다음과 같은 구조 같은 것을 원하는 :

{ 
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"), 
type: "memory_used", 
values: { 
    0: 999999, 
    … 
    37: 1000000, 
    38: 1500000, 
    … 
    59: 2000000 
} 
} 

것은 내가 키와 값이 모두 정수 따라 때문에 "값"BsonDocument를 업데이트 할 수없는 것이다. 나는 inc하지만 행운을 시도했습니다.

도움이 될 것입니다. 감사.

+0

다소 불분명합니다. "timestamp"및 값에 datetimestamp가 표시됩니다. 값은 (분당) 증분 값은 단지 값의 배열입니까? – HoefMeistert

+0

값은 15 분마다 증가합니다. 즉, 내가 얻고 자했던 구조입니다. –

답변

1

내가 원한다고 생각하고 싶습니다. 의견을 읽은 후에 업데이트하십시오. 다양한 방법이 있습니다.

코멘트에서 언급 한 블로그에서 배열 크기가 60 (매초) 인 단일 문서를 작성하면 문서를 다음과 같이 업데이트 할 수 있습니다.

db.metrics.update(
    { 
    timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"), 
    type: ”memory_used” 
    }, 
    {$set: {“values.59”: 2000000 } } 
) 

여기서 .59는 업데이트하려는 초입니다.

if (second==0){ 
//insert the "new" timestamped object into the collection 
} 
else{ 
var update = Builders<Metric>.Update.Set(e => e.values[second], this.getRandomMetric()); 
} 

이 당신에게 문서를 제공해야합니다 : upsert은 당신이 뭔가를 할 수 귀하가 언급 한 바와 같이 C#을 사용하는 경우 첫 번째 업데이트는 문서

를 생성 true로 설정되어있을 때, 그래서 그냥 업데이트마다 두 번째 전화 값의 배열은 59 개입니다.

하지만 실제로보고 싶지 않은 이유는 단지 하나의 문서에 저장하는 것이 그 이유일까요?

{ 
    timestamp_minute: ISODate("2013-10-10T23:06:01.000Z"), 
    type: "memory_used", 
    value: 999999 
}, 
{ 
    timestamp_minute: ISODate("2013-10-10T23:06:37.000Z"), 
    type: "memory_used", 
    value: 1000000 
    }, 
    timestamp_minute: ISODate("2013-10-10T23:06:59.000Z"), 
    type: "memory_used", 
    value: 2000000 
    } 

제한된 기록에 관심이 있으시면 capped collection에 넣으십시오. 평균을 그룹화하여 다른 콜렉션에 넣을 수 있습니다. 이를 위해 $out operator과 함께 집계 프레임 워크를 사용할 수 있습니다. 예를 들어 시간당 유형별 가치를 그룹화하거나 필요에 맞는 모든 것을 그룹화하십시오.

+0

실제로 MongoDB 블로그에서 가져 와서 가능해야한다고 생각합니다./http://blog.mongodb.org/post/65517193370/schema-design -for-time-series-data-in-mongodb –

+0

응답 해 주셔서 감사합니다. 내가 csharp를 사용하고 있기 때문에 값 x 위치 x에 빌더를 사용하여 액세스 할 수 없습니다. 내가 그걸 어떻게 성취 할 수 있는지 당신은 알고 있습니까? 이제 나는 이것을 가지고있다 : var update = Builders .Update.Set (e => e.values., this.getRandomMetric()); collection.FindOneAndUpdate (필터, 업데이트, 새 FindOneAndUpdateOptions {IsUpsert = true}); 그러나이 같은 BsonDocument 위치에 액세스 할 수 없습니다. –

+0

위의 대답을 참조하십시오. 감사합니다. –

0

그래서 내가 알아 냈어. 최선의 접근 방법인지는 잘 모르겠지만 작동한다. 희망도 도움이 누군가.

var update = Builders<Metric>.Update.Set(e => e.values["0"], this.getRandomMetric()).Inc(e => e.numberOfRecords, 1);