【问题标题】:mongodb collection fetch information with criteriamongodb 集合根据条件获取信息
【发布时间】:2017-11-06 17:24:01
【问题描述】:

我面临以下问题:

我在 mongoDB 的集合中有这些数据

   { Node: '2', Type: 'temperature', Value: '25.9', _id: 5936f90c81c543363d42f598 },
   { Node: '3', Type: 'temperature', Value: '31.0', _id: 5936f90c81c543363d42f599 },
   { Node: '1', Type: 'humidity', Value: '45.2', _id: 5936f90c81c543363d42f59a },
   { Node: '2', Type: 'humidity', Value: '55.3', _id: 5936f90c81c543363d42f59b }

我想按类型获取它。

在我的代码中找不到我做错了什么...

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');
var url = 'mongodb://localhost:27017/myproject';
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  if (err) throw err;
  var collection = db.collection('readings');
  collection.find({}).toArray(function(err, result) {
    if (err) throw err;
    //console.log(result); //mostrar os resultados
    var numTemps = 0;
    result.forEach(function(err,doc){
      if ("temperature" in result) {
        numTemps = numTemps + 1;
      };
    });
    var numHums = 0;
    result.forEach(function(err,doc){
      if ("humidity" in result) {
        numHums = numHums + 1;
      };
    });
    console.log("Temps: " + numTemps);
    console.log("Hums: " + numHums);
    db.close();
  });
});

【问题讨论】:

  • 终端结果:温度:0 嗡嗡声:0

标签: node.js mongodb mongodb-query


【解决方案1】:

我不确定那里发生了什么,但看起来都错了。要获得各种类型的计数,请尝试以下操作:

db.readings.count({temperature: $exists: true}})
db.readings.count({humidity: $exists: true}})

【讨论】:

    【解决方案2】:

    你有一些错误。

    result.forEach(function(err,doc){
          if ("temperature" in result) {
            numTemps = numTemps + 1;
          };
        });
        var numHums = 0;
        result.forEach(function(err,doc){
          if ("humidity" in result) {
            numHums = numHums + 1;
          };
        });
    

    我相信你的真正意思是:

    result.forEach(function(doc){
          if ("temperature" in doc) {
            numTemps = numTemps + 1;
          };
        });
        var numHums = 0;
        result.forEach(function(doc){
          if ("humidity" in doc) {
            numHums = numHums + 1;
          };
        });
    

    或者,具有更好的格式和性能(以及更多DRY):

    result.forEach(function(doc){
    
      if ("temperature" in doc) {
        numTemps++;
      };
    
      if ("humidity" in doc) {
        numHums++;
      };
    
    });
    

    【讨论】:

    • 我错过了什么?为什么要使用这种方法而不是仅仅调用 count?
    • 调用 count 两次对数据库来说有点重;如果数据库不是那么大,我可能也会使用 2 个计数查询,或者更好的是,使用 mapReduce(尽管可能有点过头了)。
    • 如果数据库很大,那么您将提取每条记录并对其进行迭代。 Count 旨在计算记录,如果您有适当的索引,它根本不会对数据库造成负担。我认为帮助他走这条路是错误的,这显然是一种不好的做法。
    • 我同意你的观点,我实际上在生产代码中使用了 double .counts;但是,我想帮助 OP 了解他们的代码出了什么问题。
    • @AbeMiessler 你不会,但这个问题很糟糕,很可能是 X-Y 问题,但如果没有 OP 提供更多信息,这很难说。
    【解决方案3】:

    谢谢大家。

    通过以下方式解决了这个问题:

    collection.find({}).toArray(function(err, result) {
    if (err) throw err;
    //console.log(result);
    var numHums = 0;
    var numTemps = 0;
    var i = 0;
    result.forEach(function(err,values){
      console.log(result[i].Type);
      if (result[i].Type == 'humidity') {
        numHums = numHums + 1;
      }
      if (result[i].Type == 'temperature') {
        numTemps = numTemps + 1;
      };
      i = i + 1;
    });
    console.log("Temps: " + numTemps);
    console.log("Hums: " + numHums);
    db.close();
    });
    

    编辑:

    根据这里用户的建议更改了foreach:

    result.forEach(function(values){ 
     console.log(values.Type); 
     if (values.Type == 'humidity') { 
      numHums = numHums + 1; 
     } 
     if (values.Type == 'temperature') { 
      numTemps = numTemps + 1; 
     }; 
    });
    

    【讨论】:

    • 您使用 forEach 错误。请参阅 nadavvadan 的回答。
    • 是的,这是forforEach 之间的奇怪混合体。我不会这样做
    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2023-01-12
    • 2015-07-19
    • 2021-07-26
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多