MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:Você deve pré-alocar um documento se estiver usando $ addToSet ou $ push?


É recomendado se for viável para o caso de uso, o que geralmente não é. Os dados de séries temporais são uma exceção notável. Ele realmente não se aplica com $addToSet e $push porque eles tendem a aumentar o tamanho do documento aumentando uma matriz.

Pare. Tem certeza de que deseja arrays em constante crescimento com dezenas de milhares de entradas? Você vai consultar querendo entradas específicas de volta? Você vai indexar algum campo nas entradas da matriz? Você provavelmente quer repensar a estrutura do seu documento. Talvez você queira que cada data entrada seja um documento separado com campos como market , type , createdAt replicado em cada um? Você não estaria se preocupando com movimentações de documentos.

Por que a matriz crescerá para 75 mil entradas? Você pode fazer menos entradas por documento? Estes são dados de série temporal ? É ótimo poder pré-alocar documentos e fazer atualizações in-loco com o mecanismo de armazenamento mmap, mas não é viável para todos os casos de uso e não é um requisito para o MongoDB ter um bom desempenho.

Não, isso não é realmente útil. O tamanho do documento será calculado com base no tamanho BSON dos valores nulos na matriz, portanto, quando você substituir null com outro tipo, o tamanho aumentará e você terá reescritas de documentos de qualquer maneira. Você precisaria pré-alocar a matriz com objetos com todos os campos definidos para um valor padrão para seu tipo, por exemplo,
{
    "date" : ISODate("1970-01-01T00:00:00Z")    // use a date type instead of a string date
    "price" : 0,
    "amount" : 0,
    "tid" : "000000", // assuming 7 character code - strings icky for default preallocation
    "type" : "none"    // assuming it's "buy" or "sell", want a default as long as longest real values
}