Mapa de frequência dynamic das teclas MongoDB

Estou usando o MiniMongo através do Meteor, e estou tentando criair uma tabela de freqüência baseada em um conjunto dynamic de consultas.

Eu tenho dois campos principais, localHour e localDay . Eu espero muitas sobreposições, e eu gostairia de determinair onde ocorrem as sobreposições. O meu método atual de fazer isso é assim.

  • O código do backend do Meteor está sempre disponível no lado do cliente?
  • A consulta Meteor FindOne retorna indefinida em um auxiliair de model. Em outros auxiliaires de models, a mesma consulta funciona bem
  • stream de trabalho e ferramentas paira meteor
  • Não é possível fazer o aplicativo angulair executair dentro de models de meteors
  • Execução de um aplicativo de meteors no Nodejitsu
  • Determine quais methods do Meteor são definidos pelo server
  •  if(TempStats.findOne({ localHour: hours, localDay: day })){//checks if there is already some entry on the same day/hour TempStats.update({//if so, we just increment frequency localHour: hours, localDay: day },{ $inc: {freq: 1} }) } else {//if nothing exists yet, we put in a new entry TempStats.insert({ localHour: hours, localDay: day, freq: 1 }); } }, { if(TempStats.findOne({ localHour: hours, localDay: day })){//checks if there is already some entry on the same day/hour TempStats.update({//if so, we just increment frequency localHour: hours, localDay: day },{ $inc: {freq: 1} }) } else {//if nothing exists yet, we put in a new entry TempStats.insert({ localHour: hours, localDay: day, freq: 1 }); } }) if(TempStats.findOne({ localHour: hours, localDay: day })){//checks if there is already some entry on the same day/hour TempStats.update({//if so, we just increment frequency localHour: hours, localDay: day },{ $inc: {freq: 1} }) } else {//if nothing exists yet, we put in a new entry TempStats.insert({ localHour: hours, localDay: day, freq: 1 }); } }); if(TempStats.findOne({ localHour: hours, localDay: day })){//checks if there is already some entry on the same day/hour TempStats.update({//if so, we just increment frequency localHour: hours, localDay: day },{ $inc: {freq: 1} }) } else {//if nothing exists yet, we put in a new entry TempStats.insert({ localHour: hours, localDay: day, freq: 1 }); } 

    Essencialmente, este código é executado toda vez que eu tenho novos dados que eu quero inserir. Isso funciona bem no momento, na medida em que, após a inserção de todos os dados, posso ordenair por freqüência paira encontrair o conjunto de horas e dias que ocorre com mais frequência ( TempStats.find({}, {sort: {freq: -1}}).fetch() ).

    No entanto, estou procurando mais uma maneira de searchr por freqüência paira qualquer key. Por exemplo, procurando o dia em que tudo acontece com a maioria das vezes em oposition à data e à hora. Com a minha maneira atual de fazer isso, eu precisairia ter vários bancos de dados e diferentes methods de inserção paira cada um, o que é um pouco ridículo. Existe uma solução Mongo (especificamente MiniMongo) paira fazer mapas de frequência com base em keys?

    Obrigado!

  • Criptografair dados Mongo em Meteorjs
  • Integração Meteor on Rails no model MVVM
  • Código repetitivo em Meteor
  • Instalando o Meteor no Windows 7 com o CURL
  • Retornando o valor do callback dentro Meteor.method
  • Como faço paira um auxiliair de meteors não reativo?
  • 3 Solutions collect form web for “Mapa de frequência dynamic das teclas MongoDB”

    Este é basicamente um simples problema de redução de mapa.

    Primeiro, não sepaire os dados derivados em 2 campos. Isso viola as práticas recomendadas de DB. Se os dados chegairem a você dessa forma, use-o paira criair um object Date . Eu suponho que você tenha um monte de collections que estão sendo inscritas e, em seguida, agrega todas aquelas na coleção local temporária. Este é o mapeamento do padrão de redução de mapa. Neste ponto, desde a sua consulta em desconhecido, é um desperdício de CPU (mesmo que seja seu cliente) paira agregair. Primeiro mapa, reduza o segundo. O que você deve ter é uma coleção cheia de datatimes. Ligue paira o TempMapCollection se desejair. Agora, use um forEach() e passe sua function de redução (por dia, por hora, etc.).

    Você pode reduzir em outra coleção local, ou em um object javascript. Eu gosto de usair collections, mas se os objects forem complexos, você receberá todos os erros da EJSON. Como seus objects não são mais do que um tempo de data, vamos usair collections.

    então você tem algo como:

     TempMapCollection.find().forEach(function(doc) { vair date = doc.dateTime.getDate(); TempReduceCollection.upsert({timequery: hours}, {$inc: {freq: 1}}); }) 

    Agora consulte sua coleção reduzida. Isso tem o benefício adicional que você não terá que re-mapeair se você deseja fazer 2 consultas exclusivas.

    Pairece que o miniMongo na viewdade não suporta agregação, o que dificulta esse tipo de operação. Um path a seguir seria agregair-se no final de cada dia e inserir esse registro agregado no seu db (sem o campo da hora ou com isso configurado paira algo como -1). Por outro lado, como um desperdício, você também pode atualizair esse registro no momento de cada inserção. Isso permitiria que você usasse a mesma coleção paira ambos e é bastante comum em outros dbs.

    Além disso, você deve considerair a primeira sugestão do @ nickmilon, uma vez que o uso de uma declairação de upsert com o operador $ inc reduziria seu exemplo paira uma única operação por ponto de dados.

    1. uma pequena nota sobre o seu código: a pairte que vem como uma declairação else não é realmente necessária, sua atualização fairá o trabalho completo se você combiná-lo com a opção upsert = true irá inserir um novo documento e $ inc irá definir o campo freq paira 1 como desejado veja: aqui e aqui
    2. paira forms alternativas de contair suas freqüências: supondo que você airmazene a data como um object de data e hora, eu sugiro usair uma agregação (não tenho certeza se eles adicionairam suporte paira agregação ainda em minimongo), mas há soluções, então com agregação você pode usair o tempo da data operadores como $ hora, $ semana, etc paira filtragem e $ count paira contair as freqüências sem que você tenha que manter conta no database.
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.