2014-06-08 2 views
2

pymongo (mongodb 용 파이썬 모듈)를 사용 중입니다.pymongo에서 서버에 의해 생성 된 ObjectID

ObjectID가 서버에 의해 자동으로 생성되기를 원하지만, 지정하지 않으면 pymongo 자체에서 생성 된 것처럼 보입니다.

문제는 제가 ObjectID를 사용하여 (_id 필드로 정렬하여) 시간순으로 정렬한다는 것입니다. 그러나 각 컴퓨터에 설정된 시간을 사용하고있어 진정으로 신뢰할 수는없는 것 같습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

답변

3

, 당신은 False에 (enigmatically 명) manipulate 옵션을 설정하여 클라이언트 대신 _id를 추가 할 서버를 강제 할 수

coll.save({'foo': 'bar'}, manipulate=False) 
+0

멋지 네요! 그것으로 어떤 심각한 단점 (성능 ...)? – koushkov

+1

@ user3474490 당신이 [sharding] (http://docs.mongodb.org/manual/sharding/)을 사용할 때 단점이있는 것 같아요. 이것은 실패 할 것입니다. (ObjectId는 서버를 샤딩하여 생성 될 것입니다.) 당신이 안 간다면, 이것은 제 해결책보다 확실히 좋습니다. – yaoxing

+0

@ user3474490 성능 저하가 없어야합니다. 단순히'_id'가 생성되는 지점을 재배치합니다. – JohnnyHK

1

저는 파이썬 사용자가 아니지만 서버로 _id를 생성 할 수있는 방법이 없습니다. 성능상의 이유로 _id는 항상 드라이버에 의해 생성되므로 문서를 삽입 할 때 _id를 다시 얻기 위해 다른 쿼리를 수행 할 필요가 없습니다.

IDENTITY ID와 마찬가지로 int sequence _id를 생성하여 SqlServer의 ID를 생성 할 수 있습니다.

{_id: ObjectId("..."), seqNo: 1 } 

트릭은, 당신이 찾기를 유지하기 위해 findAndModify를 사용해야하고 이렇게하려면, 당신은 내 프로젝트에 예를 들어, 특정 컬렉션의 기록을 유지해야 할 단 하나 개의 기록을 가지고있는하는 seed을있다 동일한 "거래"에서 수정하십시오.

var idSeed = db.seed.findAndModify({ 
    query: {}, 
    sort: {seqNo: 1}, 
    update: { $inc: { seqNo: 1 } }, 
    new: false 
}); 
var id = idSeed.seqNo; 

이렇게하면 모든 인스턴스에 고유 한 시퀀스 #가 생기고 레코드를 정렬하는 데 사용할 수 있습니다. 당신이 save를 호출하고 _id 필드없이에게 문서를 전달하면

+0

스마트 구현! 그러나 JohnnyHK의 답변은 씨앗을 가져 오기위한 추가 쿼리를 제한하는 것으로 보입니다 – koushkov

+0

질문 : seqNo에 $ inc를 적용하면 안됩니까? – koushkov

+0

@koushkov 네, 제 잘못, 'seqNo'에 있어야합니다. – yaoxing

관련 문제