2011-12-23 1 views
2

John Nunemaker는 Mongo ObjectIds에 대한 유용한 정보가 담긴 블로그 게시물을 가지고 있습니다. http://mongotips.com/b/a-few-objectid-tricks/ - 특히 generation_time에 대한 팁에 관심이있었습니다. 그는 mongo 문서에 created_at 시간을 명시 적으로 저장하지 않아도된다는 사실을 알았습니다. 항상주의를 기울인 ID에서 가져올 수 있기 때문입니다. 문제는 내가 mongomapper에서 생성 된 문서를 찾기 위해 mongo 쿼리를 생성하는 방법을 알아낼 수 없다는 것입니다.mongo ids에 generation_time을 쿼리하는 중

나는 키를 저장하는 경우 : 나는 모든 문서는이 같은 12 월 1 일 이후 생성 얻을 mongomapper에 쿼리를 할 수있는 문서의 한 부분으로 created_at을 :

에 매핑
Foo.where(:created_at.gt=>Time.parse("2011-12-01")) 

(:

{created_at: {"$gt"=>Thu Dec 01 06:00:00 UTC 2011}} 

ObjectId를 사용하여 동일한 쿼리를 작성하는 방법을 알아낼 수 없습니다.이 함수는 다음과 같이 보일 것이라고 생각합니다. (분명히 generation_time은 루비 함수이지만, objectid에 사용할 수있는 동등한 함수가 있습니다. 몽고 쿼리 문맥?)

Foo.where('$where'=>"this.id.generation_time > new Date('2011-12-01')") 
{$where: "this.id.generation_time > new Date('2011-12-01')"} 

또 다른 질문 : 별도의 타임 스탬프를 저장하지 않으면 mongodump를 사용하여 데이터베이스를 덤프하고 복원하면 타임 스탬프 메타 데이터가 손실됩니까? ObjectId를 보존하는 권장 백업/복원 기술이 있습니까?

답변

2

this은 쉘에서 실행되는 자바 스크립트 코드이지만 생성 시간은 mongomapper 메서드이므로 코드에서 이해할 수 없습니다.

에서 당신이 자기 푸의 인스턴스를 참조

created_at = self.id.generation_time.in_time_zone(Time.zone) 

같은 말을하여 ID를 얻을 것 레일.

그리고 당신은 비록 귀찮게 왜

Foo.find('_id' => {'$gte' => BSON::ObjectId.from_time(created_at)}).count 

을 말함으로써 쿼리 것이 ... 번거 로움이 그럴 가치가 없어, 그냥 시간을 저장합니다.

mongodump를 수동으로 읽고 다시 삽입하지 않는 한 백업/복원 기술과 관련하여 유사한 도구는 개체 ID를 보존하므로 걱정할 필요가 없습니다.

+0

좋습니다. 그래서 여기에있는 아이디어는 내가 조회 한 시간부터 작성된 ID와 ID를 비교하는 것입니다. 그래서 이드는 생성 시간에 따라 단조롭게 증가 할 것인가? – Bee

+1

@Bee : 맞습니다. –