使用 MongoDB 和 Nodejs 插入和查询日期

IT技术 javascript node.js mongodb date
2021-03-17 02:45:34

我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录。

我将日期添加到抓取脚本中的 json 对象中,如下所示:

jsonObj.last_updated = new Date();

这个对象被插入到 mongodb 中。我可以看到它如下:

 "last_updated" : "2014-01-22T14:56:59.301Z"

然后在我的 nodejs 脚本中,我做了一个 findOne():

 var jObj = JSON.parse(line.toString());

 collection.findOne(jObj,function(err, doc) {
   if (doc){
     console.log(doc._id);
   } else  {
     console.log('not found');
   }
 });

找不到对象。如果我从找到的对象中删除 last_updated 字段,那么它肯定是问题所在。

如果我按如下方式隔离该字段:

collection.findOne({last_updated: '2014-01-22T14:56:59.301Z'},function(err, doc) {
  if (doc){
    console.log(doc._id);
  } else  {
    console.log('not found');
  }
});

什么也没有回来。请问我做错了什么?

5个回答

您需要传递日期对象而不是日期字符串。

collection.findOne({last_updated: new Date('2014-01-22T14:56:59.301Z')},function(err, doc) {

MongoDB 驱动程序会将其转换为ISODate

{ 
   "_id" : ObjectId("52dfe0c469631792dba51770"), 
   "last_updated" : ISODate('2014-01-22T14:56:59.301Z') 
}

检查这些问题:

要存储现在使用new Date没有括号
2021-05-01 02:45:34
对。千万不能使用new Date().toISOString()插入的MongoDB数据库时(而不是仅仅使用new Date()),因为MongDB已经为你做和.toISOString(转换)将使.find()运算符或$ GTE运营商的数据库上失败
2021-05-11 02:45:34
使用new Date不使用括号(使用节点和12.18蒙戈3.4.1)给了我同样的结果文档(UTC的ISODate)作为使用它与括号,即new Date()
2021-05-12 02:45:34
结合momentjs Items.find({sellingState: "Active", endTime: {$lt: new Date(moment().subtract(1, 'day').toISOString())}}, {limit: 10})
2021-05-14 02:45:34

澄清。重要的是要知道:

  • 是的,您必须传递一个 Javascript Date 对象。
  • 是的,它必须是 ISODate 友好的
  • 是的,根据我让它工作的经验,您需要将日期操作为 ISO
  • 是的,处理日期通常总是一个乏味的过程,mongo 也不例外

这是一个有效的代码片段,我们在其中进行了一些日期操作以确保 Mongo 可以正确处理它。在此示例中,我使用 mongoose module并希望其日期属性小于(即之前)作为 myDate 参数给出的日期的行的结果。

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
我相信这是不正确的,并犯了同样的错误,导致我现有数据库中的错误。千万不能使用new Date().toISOString()插入的MongoDB数据库时(而不是仅仅使用new Date()),因为MongDB已经为你做和.toISOString(转换)将使.find()运算符或$ GTE运营商的数据库上失败
2021-04-29 02:45:34
myDate 参数看起来如何?是字符串 'Mon Feb 29 2016 21:04:59 GMT+0100 (CET)' 吗?
2021-05-05 02:45:34

我最近遇到了同样的问题,我想添加一些额外的信息。

您可以通过两种方式插入日期:

  1. 在 nodejs 服务器端创建(例如在 ExpressJS 脚本中)

示例:插入一个新对象并为其添加时间戳

db.collection('mycollection').findOneAndUpdate({'name': req.body.name}, {
  // only "update" if it's an insert, meaning name is not found
  $setOnInsert: {
    'name': req.body.name,
    'date_added': new Date()
  }
}, { 
  upsert: true
}, (err, result) => {
  if(err) return res.send(err);
  res.send(result);
});
  1. 在客户端从 JS 创建,然后通过 POST 请求使用 JSON 对象中的 REST API 通过网络发送

例子:

// Send POST Request here
fetch('addDate', {
  method: 'post',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'date_added':  new Date()
  })
})

对于 1. 和 2.,您可以使用new Date('2014-01-22T14:56:59.301Z')上述答案中所述函数创建日期 不同之处在于,如果您像 1. 那样在服务器端使用 MongoClient 包进行操作,则它会存储为ISODate('2014-01-22T14:56:59.301Z')MongoDB 中的 a。如果您按照 2. 中的方式进行操作,则在客户端将其存储为 String:'2014-01-22T14:56:59.301Z'在 MongoDB 中。

要查询您需要使用的 ISODate 对象new Date('2014-01-22T14:56:59.301Z')ISODate('2014-01-22T14:56:59.301Z') 要查询您只使用字符串的字符串:'2014-01-22T14:56:59.301Z'

以下是一些使用 mongo shell 的查询示例:

存储为字符串的日期:

db.mycollection.findOne({date_added {$gte:'2018-06-22T00:07:53.688Z'}})

这返回

{
  "_id" : ObjectId("5b2c3dd90078ce3cd484ef21"),
  "name" : "alfons",
  "date_added" : "2018-06-22T00:07:53.688Z"
}

存储为 ISODate 的日期:

db.mycollection.findOne({date_added: {$lte: ISODate('2018-06-26T23:24:37.023Z')}})

或改用“新日期”:

db.mycollection.findOne({date_added: {$lte: new Date('2018-06-26T23:24:37.023Z')}

这将返回:

{
  "_id" : ObjectId("5b2bb21e1954b104e61ff735"),
  "name" : "ceasar",
  "date_added" : ISODate("2018-06-21T14:11:41.323Z")
}

将模式中的默认键和值添加到 Date.now()

publishedAt:{ type:Date, default:Date.now() }
2021-04-23 02:45:34
如何在 Schema 中添加默认键?
2021-04-24 02:45:34

如果您使用时间戳数据进行查询。EG:“createdAt”:“2021-07-12T16:06:34.949Z”

const start  = req.params.id; //2021-07-12
const data = await Model.find({
            "createdAt": {
              '$gte': `${start}T00:00:00.000Z`,
              '$lt': `${start}T23:59:59.999Z`
            }
          });
console.log(data);

在这种情况下,它将显示特定日期 .i.,e 的数据。“2021-07-12”