Tenho um MongoDB com documentos no formato:
{
...
"template" : "templates/Template1.html",
...
}
onde template
ou é "templates/Template1.html"
, "templates/Template2.html"
ou "templates/Template3.html"
.
Estou usando esta consulta para agrupar template
e contar quantas vezes cada um template
é usado:
var group = {
key:{'template':1},
reduce: function(curr, result){ result.count++ },
initial: { count: 0 }
};
messageModel.collection.group(group.key, null, group.initial, group.reduce, null, true, cb);
Estou recebendo o resultado correto, mas está formatado assim:
{
"0" : {
"template" : "templates/Template1.html",
"count" : 2 },
"1" : {
"template" : "templates/Template2.html",
"count" : 2 },
"2" : {
"template" : "templates/Template3.html",
"count" : 1 }
}
Eu queria saber se é possível alterar a consulta para que ela retorne algo como:
{
"templates/Template1.html" : { "count" : 2 },
"templates/Template2.html" : { "count" : 2 },
"templates/Template3.html" : { "count" : 1 }
}
ou mesmo:
{
"templates/Template1.html" : 2 ,
"templates/Template2.html" : 2 ,
"templates/Template3.html" : 1
}
Prefiro alterar a consulta e não analisar o objeto retornado da consulta original.
Conforme mencionado por Blakes Seven nos comentários, você pode usar em aggregate()
vez de group()
atingir quase o resultado desejado.
messageModel.collection.aggregate([
{ // Group the collection by `template` and count the occurrences
$group: {
_id: "$template",
count: { $sum: 1 }
}
},
{ // Format the output
$project: {
_id: 0,
template: "$_id",
count: 1
}
},
{ // Sort the formatted output
$sort: { template: 1 }
}
]);
A saída ficaria assim:
[
{
"template" : "templates/Template1.html",
"count" : 2 },
{
"template" : "templates/Template2.html",
"count" : 2 },
{
"template" : "templates/Template3.html",
"count" : 1 }
}
]
Novamente, conforme declarado por Blakes nos comentários, o banco de dados só pode gerar uma série de objetos, em vez de um objeto solitário. Essa seria uma transformação que você precisaria fazer fora do banco de dados.
Acho que merece ser reafirmado que essa transformação produz um antipadrão e deve ser evitada. Um nome de chave de objeto fornece o contexto ou a descrição do valor. Usar a localização de um arquivo como nome-chave seria uma descrição bastante vaga, enquanto 'modelo' fornece um pouco mais de informação sobre o que esse valor representa.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras