【问题标题】:How to get data from mongodb between including two days in mongodb using mongoose如何使用 mongoose 在 mongodb 中包含两天之间从 mongodb 获取数据
【发布时间】:2020-09-27 06:41:13
【问题描述】:

试图在两天之间从 mongodb 获取记录,但在我的代码中只有两天之间。

例子:

01-06-2020 到 08-06-2020 = 获取从 02-06-2020 到 08-06-2020 的记录(缺少 01-06-2020)

但我想要 01-06-2020 到 08-06-2020 = 需要获取从 01-06-2020 到 08-06-2020 的记录。

如何获得?

MongoDB数据:

{ 
_id:ObjectId("5edd1df67b272e2d4cf36f70"),
pname:"Test 1", 
category:"Choco 1",
todaydate:2020-06-01T18:30:00.000+00:00
},
{ 
_id:ObjectId("5gdd1df67b272e2d4cf36f72"),
pname:"Test 2", 
category:"Choco 3",
todaydate: 2020-06-02T18:30:00.000+00:00
},
{ 
_id:ObjectId("5kdd1df67b272e2d4cf36f74"),
pname:"Test 5", 
category:"Choco 6",
todaydate: 2020-05-01T18:30:00.000+00:00
},
{ 
_id:ObjectId("5ewd1df67b272e2d4cf36f75"),
pname:"Test 6", 
category:"Choco 8",
todaydate: 2020-06-03T18:30:00.000+00:00
},
{ 
_id:ObjectId("5sdd1df67b272e2d4cf36f76"),
pname:"Test 3", 
category:"Choco 9",
todaydate: 2020-06-04T18:30:00.000+00:00
},
{ 
_id:ObjectId("5tdd1df67b272e2d4cf36f78"),
pname:"Test 11", 
category:"Choco 10",
todaydate: 2020-06-05T18:30:00.000+00:00
}

data.model.js:

const mongoose = require('mongoose'); 
var userSchemaDate = new mongoose.Schema({ 
    pname: {
        type: String
    },  
    category: {
        type: String
    },  
    todaydate: {
        type: Date
    }   
}, {
    versionKey: false,
    collection: 'data'
}); 

module.exports = mongoose.model('Data', userSchemaDate);

data.controller.js:

module.exports.getReportTableData = (req, res, next) => {
    var collection = req.query.collection; 
    let tableReportdata = dbc.model(collection);

    let date1 = "01-06-2020"; dd/mm/yyyy
    let date2 = "07-06-2020"; dd/mm/yyyy

    tableReportdata.find({
            $and: [{
                    todaydate: {
                        $gt: date1
                    }
                },
                {
                    todaydate: {
                        $lt: date2
                    }
                }
            ]
        }, function(err, docs) {
            if (err) {
                console.log(err);
                return;
            } else {
                console.log("Successful loaded report data"); 
                res.json({ data: docs, msg: 'Report data loaded.' });
            }
        });
   }

【问题讨论】:

  • 你查看query operators的官方文档了吗?
  • @thammada:那我可以用 $gte, $lte 吗??
  • 没错,最好的方法就是尝试一下:)
  • $gte, $lte 不工作
  • 您可能将字符串值与日期值进行比较,您必须先将它们转换为相同的类型。但是,为了比较日期字符串,您应该将它们格式化为'%Y-%m-%d'(年/月/日,而不是日/月/年),因为它应该根据实际日期按字母顺序排序。请包含您的架构,然后我们可以看到todaydate 是如何存储的

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

The answer 在您的其他问题上应该返回正确的结果。我还要强调,最好将日期存储为日期对象。

让我们尝试另一种方法,在输入值上也使用$dateFromString

tableReportdata.find({
  $expr: {
    $and: [
      {
        $gte: [
          {
            $dateFromString: {
              dateString: "$todaydate",
              format: "%d-%m-%Y",
              timezone: "UTC"
            }
          },
          {
            $dateFromString: {
              dateString: "01-06-2020",
              format: "%d-%m-%Y",
              timezone: "UTC"
            }
          }
        ]
      },
      {
        $lte: [
          {
            $dateFromString: {
              dateString: "$todaydate",
              format: "%d-%m-%Y",
              timezone: "UTC"
            }
          },
          {
            $dateFromString: {
              dateString: "07-06-2020",
              format: "%d-%m-%Y",
              timezone: "UTC"
            }
          }
        ]
      }
    ]
  }
}, function(err, docs) {
  if (err) {
    console.log(err);
    return;
  } else {
    console.log("Successful loaded report data"); 
    res.json({ data: docs, msg: 'Report data loaded.' });
  }
});

带有辅助功能的较短版本

const dateUTCexpr = (dateString) => ({
  $dateFromString: {
    dateString,
    format: "%d-%m-%Y",
    timezone: "UTC"
  }
})

tableReportdata.find({
  $expr: {
    $and: [
      {
        $gte: [dateUTCexpr("$todaydate"), dateUTCexpr("01-06-2020")]
      },
      {
        $lte: [dateUTCexpr("$todaydate"), dateUTCexpr("07-06-2020")]
      }
    ]
  }
}, function(err, docs) {
  if (err) {
    console.log(err);
    return;
  } else {
    console.log("Successful loaded report data"); 
    res.json({ data: docs, msg: 'Report data loaded.' });
  }
});

如果您在架构中将todaydate 定义为String,还要确保它在您的数据库中正确转换,您可以使用以下代码

const dateUTCexpr = (dateString) => ({
  $dateFromString: {
    dateString,
    format: "%d-%m-%Y",
    timezone: "UTC"
  }
})

tableReportdata.find({
  todaydate: {
    $gte: dateUTCexpr("01-06-2020"),
    $lte: dateUTCexpr("07-06-2020")
  }
}, function(err, docs) {
  if (err) {
    console.log(err);
    return;
  } else {
    console.log("Successful loaded report data"); 
    res.json({ data: docs, msg: 'Report data loaded.' });
  }
});

【讨论】:

  • 获取所有记录..不使用 $gte 和 $lte
  • 我输入的变量不正确,应该是$todaydate 而不是$date,现在已修复
  • 是的..我已经改变了..但没有工作..获取所有记录
  • 我认为 dateUTCexpr 发生了一些事情
  • 你有什么解决办法吗?
猜你喜欢
  • 2020-09-26
  • 2013-11-06
  • 2011-11-20
  • 2012-02-12
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多