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

Posted

技术标签:

【中文标题】使用 MongoDB 和 Nodejs 插入和查询日期【英文标题】:Inserting and Querying Date with MongoDB and Nodejs 【发布时间】:2014-02-12 17:27:43 【问题描述】:

我需要一些帮助,在 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');
  
);

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

【问题讨论】:

new Date(Date.now()).toISOString() 【参考方案1】:

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

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') 

检查这些问题:

MongoDB + nodejs : how to query ISODate fields? ISODate is not defined

【讨论】:

结合momentjs Items.find(sellingState: "Active", endTime: $lt: new Date(moment().subtract(1, 'day').toISOString()), limit: 10) 现在存储使用不带括号的new Date 是的。 不要在插入 MongoDB 数据库时使用new Date().toISOString()(而只使用new Date()),因为 MongDB 已经为您进行了转换,并且 .toISOString() 将生成 .find() 运算符或 $gte 运算符数据库失败 使用不带括号的new Date(使用Node 12.18和mongo 3.4.1)在文档(UTC ISODate)中的结果与使用带括号的结果相同,即new Date() 【参考方案2】:

澄清一下。重要的是要知道:

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

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

var inputDate = new Date(myDate.toISOString());
MyModel.find(
    'date':  $lte: inputDate 
)

【讨论】:

myDate 参数长什么样?是字符串 'Mon Feb 29 2016 21:04:59 GMT+0100 (CET)' 吗? 我认为这是不正确的,并且犯了同样的错误,导致我现有的数据库出现错误。在插入 MongoDB 数据库时不要使用new Date().toISOString()(而只使用new Date()),因为 MongDB 已经为您完成了转换,并且 .toISOString() 将生成 .find() 运算符或 $gte 运算符数据库失败【参考方案3】:

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

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

    在 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);
);
    从 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 包执行此操作,它将在 MongoDB 中存储为 ISODate('2014-01-22T14:56:59.301Z')。 如果您按照 2. 中的方式进行操作,则在客户端将其存储为字符串:'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")

【讨论】:

【参考方案4】:

在 Schema 中添加 Default 键并将值添加到 Date.now()

【讨论】:

如何在 Schema 中添加默认键? publishedAt: type:Date, default:Date.now() 【参考方案5】:

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

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

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

【讨论】:

以上是关于使用 MongoDB 和 Nodejs 插入和查询日期的主要内容,如果未能解决你的问题,请参考以下文章

使用mongodb在nodejs中使用锁定/事务读取和插入文档

Nodejs学习笔记--- 与MongoDB的交互(mongodb/node-mongodb-native)MongoDB入门

使用 nodejs 和 chartjs 从 mongodb 插入和获取值

如何使用 mongoose 和 NodeJs 在 Mongodb 的数组字段中插入数据

优化nodejs mysql插入

NodeJS 和 MongoDB:在文档插入时向多个用户发送电子邮件和仪表板通知 [关闭]