Depois de vários minutos de um programa grande que envia muitos dados para o mongo, meu log começa a mostrar uma mensagem para (eu acho) cada atualização. Isso parece terrivelmente barulhento, há algum motivo especial para sentir a necessidade de fazer isso?
Tue Jun 5 14:32:37 [conn3] update benchmark.entity
query: { corefEntityId: "45-LOCATION" }
update: { $set: { corefEntityId: "45-LOCATION", type: "Location" },
$push: { indocs: { docid: "cfcc403b-714f-4c5d-8507-ccb5b6354654",
ordinal: 26, label: "United States", mentions: [ "United States" ] } },
$addToSet: { allMentions: { $each: [ "United States" ] } },
$inc: { documentCount: 1 } } 116ms
Como uma nota de rodapé talvez mais responsável, eu me pergunto: um 'upsert' que adiciona a algum documento interno é mais rápido ou mais lento do que uma inserção simples em alguma outra coleção do documento interno como um documento de nível superior?
Acho que você quis dizer upsert em vez de upstart (upstart sendo um tipo de trabalho em um sistema Ubuntu). Upsert significa "atualizar o documento, se presente; inserir (um único documento) se estiver faltando". O MongoDB determina que o documento está ausente apenas examinando o documento de critérios que você passa para ele.
Essa consulta para determinar se o documento existe provavelmente é a parte lenta aqui. Você deve executar uma explicação apenas no find para determinar se ele está usando os índices corretamente e é tão eficiente quanto deveria ser:
http://www.mongodb.org/display/DOCS/Explain
Se não estiver usando um índice, você deve adicionar um para acelerar as coisas. Dependendo se este exemplo é típico de seu plano de consulta, eu esperaria que um índice em "corefEntityId" fosse uma boa ideia, no mínimo. Se a descoberta for mais complexa em outros casos, você pode procurar um índice composto e usar a dica para ver qual é o ideal:
http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint
Em termos de registro - quando ele registra uma consulta como você viu em seu exemplo, o motivo é porque o valor "slowms" padrão é 100. Ou seja, o MongoDB registrará todas as consultas que levarem mais de 100 ms para serem concluídas. Isso pode ser ajustado:
http://www.mongodb.org/display/DOCS/Database+Profiler#DatabaseProfiler-EnablingProfiling
Se você quiser configurá-lo para 200ms, por exemplo: