나는 sort
및 limit
을 사용하여 Daimon의 첫 번째 대답과 동일하게 입력했습니다. _id가 생성되는 방식 때문에 일부 드라이버 (최하위 부분에 대해 증가 대신 임의의 숫자를 사용하는)에서 특히 권장하지 않습니다. 가장 중요한 부분으로 2 분의 1 (밀리 세컨드와 같이 작은 것의 반대) 해상도를 갖지만 마지막 숫자는 임의의 숫자가 될 수 있습니다. 따라서 사용자가 두 번째로 두 번 저장하면 (아마도 가능성은 없지만 주목할만한 가치가 있음) 약간의 최신 문서가 종료 될 수 있습니다.
ObjectID의 구조에 대한 자세한 내용은 http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification을 참조하십시오.
나는 당신의 문서에 명시의 versionNumber 필드를 추가하는 것이 좋습니다 것입니다, 그래서 당신과 같이 해당 필드를 사용하여 비슷한 방식으로 조회 할 수 있습니다
db.coll.find({documentId: <id>}).sort({versionNum: -1}).limit(1);
편집 주석 질문에 대답
일반 DateTime을 MongoDB에 직접 저장할 수는 있지만 밀리 초 정밀도 만 MongoDB의 "DateTime"형식으로 저장합니다. 그게 충분하다면, 더 간단하게 할 수 있습니다.
BsonDocument doc = new BsonDocument("dt", DateTime.UtcNow);
coll.Insert (doc);
doc = coll.FindOne();
// see it doesn't have precision...
Console.WriteLine(doc.GetValue("dt").AsUniversalTime.Ticks);
원한다면.NET 날짜 시간 (틱)/타임 스탬프의 정밀도는, 당신은 같은 일을 얻을 캐스트의 무리를 수행 할 수 있습니다
BsonDocument doc = new BsonDocument("dt", new BsonTimestamp(DateTime.UtcNow.Ticks));
coll.Insert (doc);
doc = coll.FindOne();
// see it does have precision
Console.WriteLine(new DateTime(doc.GetValue("dt").AsBsonTimestamp.Value).Ticks);
업데이 트를 다시!
BsonTimestamp의 실제 용도는 두 번째 해상도 내에서 고유 한 타임 스탬프를 생성하는 것입니다. 따라서, 코드의 마지막 몇 줄에있는 것처럼 실제로 코드를 남용하지 않아도됩니다. 실제로 결과의 순서가 엉망이 될 것입니다. TickTime (100 나노초) 해상도로 DateTime을 저장해야하는 경우 mongodb에서 정렬 할 수있는 64 비트 int "틱"을 저장 한 다음 꺼낸 후 DateTime으로 래핑해야합니다 다시 데이터베이스, 이렇게 :
BsonDocument doc = new BsonDocument("dt", DateTime.UtcNow.Ticks);
coll.Insert (doc);
doc = coll.FindOne();
DateTime dt = new DateTime(doc.GetValue("dt").AsInt64);
// see it does have precision
Console.WriteLine(dt.Ticks);
완벽, 고마워요 다이몬. 두 번째 옵션과 관련하여 질문이 있지만 새 레코드가 주 문서 컬렉션에 삽입되는 경우 비정규 "인덱스"컬렉션을 원자 적으로 삽입하고 업데이트하는 방법은 무엇입니까? 첫 번째 문서의 인덱스 레코드가 업데이트되기 전에 다른 문서 인스턴스를 삽입 할 수 있습니까? 말이 돼? 문서가 변경되지 않았는지 확인하려면 findAndModify 권한을 사용할 수 있습니까? 나는 그것이 최신 _id를 얻었고 다시 시도 할 것인가? 그것이 요점입니까? 다시 한번 감사드립니다. – sambomartin
MongoDB는 RDBMS와 같은 트리거를 지원하지 않으므로 애플리케이션 측에서 지원합니다. findAndModify를 사용하여 id/timestamp가 더 낮은 문서를 찾은 다음 문서를 업데이트하고 업데이트 할 수 있습니다. findAndModify는 원자 적 연산이기 때문에 새 값이 현재보다 더 작은 경우에만 문서를 업데이트합니다. 이렇게하면 동시 업데이트에 대해 걱정할 필요가 없습니다. – Daimon
다시 한번 감사드립니다. 버전 번호 나 타임 스탬프를 사용한다고 가정하면 다른 프로세스가 다른 문서 인스턴스를 추가하고 "색인"문서를 업데이트하면 findAndModfy가 실패합니다. findAndModify는 현재 버전보다 버전이 더 최신인 "index"doc을 업데이트하고 업데이트합니다. 이 문제가 발생하면 단순히 최신 버전을 가져 와서 색인 문서를 다시 업데이트해야합니까? 죄송합니다. 아무 것도 반복하지 않은 경우 내 마음에 분명히 표시하고 싶습니다. – sambomartin