MongoDB를 사용하여 시계열을 처리하려고합니다. 공동체가 채택한 일반적인 해결책은 하위 문서를 사용하여 서로 다른 수준의 정보를 저장하는 것입니다 ( Schema Design for Time Series Data in MongoDB 참조).MongoDB Collection update : 기본값으로 문서 초기화
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”,
values: [
999999, // 1 second
…
1000000, // nth second
1500000, // n+1th second
…
2000000 // 60th
]
}
서 예약 정보에 의해 색인되고, 각각의 제 더 상세한 정보를 저장하는 하위 문서를 포함
는 예를 들어, 다음의 문서를보십시오.
지금까지 그렇게 좋았습니다. 이런 종류의 접근법이 제대로 작동하도록 최적화가 필요합니다
Another optimization [..] is preallocating all documents for the upcoming time period; This never causes an existing document to grow or be moved on disk.
이 하나가 update
방법에 $setOnInsert
속성을 사용할 수 있습니다 위의 최적화를 구현하려면.
db.getCollection('aCollection').update(
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”
},
{
$setOnInsert: { values: {'0': 0, '1': 0, '2': 0}},
$inc: {"values.30": 1}
},
{ upsert: true }
)
동일한 업데이트를 두 가지 다른 작업에서 같은 필드를 사용할 수 없다는 문제가 있습니다. 이 문제는이 issue에 추적
Cannot update 'values' and 'values.30' at the same time
: 위의 업데이트 istruction는 다음과 같은 오류가 발생합니다.
내 질문은 : 어떤 해결책이 있습니까?은 내가 인덱스 필드 사전 (위의 예에서, 필드의 값 type
.
감사의 값을 알 수 없기 때문에 나는 빈 문서를 미리 할당 어떤 배치를 사용할 수 없습니다 접두사 미리.
삽입이 실패하는 이유는 무엇입니까? 유형 및 타임 스탬프에 대한 고유 색인이 있습니까? –
맞아,이 지점을 삽입하는 데 그리워. '_id'는 문서의 다른 필드에서 파생되어야합니다 (예 :'-' char로 결합). –