10-1500 만 개의 항목이있는 mongodb 데이터베이스가 있습니다. 각각에 대해 처음에는 존재하지 않는 필드를 업데이트해야합니다. 예기치 않은 서버 종료로 인해 응용 프로그램이 다운되었다고 가정하면 나머지 항목을 업데이트하는 것이 가장 좋습니다.
field: {$exists: false}
을 사용해야하나요, 아니면 전체 컬렉션을 살펴보고 해당 필드가있는 경우 각 문서를 확인해야합니까, 그렇다면 업데이트를 수행해야합니까? 필자가 생각하기에 인덱스를 필드의 존재와 연관시킬 수 없으므로 $ exists는 기본적으로 같은 것이다. 어느 것이 더 빠를 것이며 그 이유는 무엇입니까?
이 필드의 값은 문서의 다른 필드에 따라 달라 지므로 다중을 수행 할 수 없습니다 : true 업데이트.
솔루션 : @DhruvPathak 및 @Sammaye는 (그래서 당신은 인덱스 필드의 존재에 링크 할 수 없습니다), 인덱스 데이터에 관련되는 동안이 아니라 필드 자체 제안으로 $가 활용할 수 있습니다 존재 필드가있는 문서의 색인 수는 크게 증가합니다.
추가 : 약간의 측면 탐색이지만, 이제 응용 프로그램이 충돌 한 이유를 알았습니다. 서버는 커서가 너무 오래 사용 되었기 때문에 커서를 시간 초과했습니다 (컬렉션의 크기를 고려할 때). 설명 된대로 batch_size
을 사용하여 피할 수 있습니다 here.
[explain()] (http://docs.mongodb.org/manual/reference/method/cursor.explain/) 도움이 될 수도 있습니다. – soulcheck
문서에 field_exists 필드를 추가 할 수 있습니다. 기본값은 false입니다. 문서를 업데이트하는 경우 "field_exists"를 true로 설정합니다. 또한이 필드에 대한 색인을 쉽게 작성할 수 있습니다. – thomas
@soulcheck 사실, explain은 $ exists 쿼리에 도움이 될 것입니다. 그러나 수동으로 각 필드를 업데이트하는 다른 경우에는 설명이 각 루프의 효율성에 대한 데이터를 제공 할 수 없습니다. 이것은 pymongo 스크립트입니다. – thehousedude