Eu sei, Object.bsonsize()
mas não tenho certeza se vai funcionar no meu caso. Desejo descobrir com eficiência quais usuários em meu aplicativo têm o maior número total de dados e tenho um pipeline de agregação que usa $lookup
para coletar todos os documentos do usuário (espalhados por 3 outras coleções) juntos. Em seguida, quero um estágio de pipeline que se pareça com:
$project: {
"_id": 1,
"username": 1,
"sizeInBytes": {
$sizeInBytes: ...
}
}
Eu sou muito novo em agregação, então não tenho certeza do que quero depois de sizeInBytes, para fazer referência a todo o documento, não apenas a uma propriedade.
Parece que talvez no MongoDB 4.0+, isso poderia ser feito usando $toString
e, $strLenBytes
mas estou surpreso por não conseguir encontrar uma maneira integrada de fazer isso de forma muito mais direta. (E, infelizmente, estou preso em 3,6 atm)
Infelizmente, mesmo com o MongoDB 4.0+, é muito complicado calcular o tamanho, como você especulou, o String
comprimento pode ser usado. Há um tíquete aberto pendente para um possível recurso futuro dentro do pipeline agregado.
Com o que você tem, sugiro usar Javascript no resultado do seu $lookup
resultado.
Algo assim, por exemplo;
db.user.aggregate([
{
$lookup: {
from: "doc1",
localField: "userId",
foreignField: "userId",
as: "doc1arr"
}
},
{
$lookup: {
from: "doc2",
localField: "userId",
foreignField: "userId",
as: "doc2arr"
}
},
{
$lookup: {
from: "doc3",
localField: "userId",
foreignField: "userId",
as: "doc3arr"
}
}
]).map(perUserData => ({ userId: perUserData.userId, size: Object.bsonsize(perUserData) }));
vai dar algo parecido;
[
{
"userId" : 1,
"size" : 250
},
{
"userId" : 2,
"size" : 350
}
]
Veja a parte não-js em mongoplayground
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras