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

时间:2014-01-22 15:08:21

标签: javascript node.js mongodb date

我需要帮助在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 个答案:

答案 0 :(得分:60)

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

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

检查以下问题:

答案 1 :(得分:11)

澄清。重要的是要知道:

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

这是一段工作代码片段,我们在其中进行一些日期操作以确保Mongo能够正确处理它。在这个例子中,我使用的是mongoose模块,并希望得到日​​期属性小于(即之前)作为myDate参数的日期的行的结果。

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

答案 2 :(得分:4)

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

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

  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')的功能如上面的答案所述。区别在于,如果您使用MongoClient软件包在服务器端按照1.那样进行操作,则它将作为ISODate('2014-01-22T14:56:59.301Z')存储在MongoDB中。 如果按照客户端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")
}

答案 3 :(得分:0)

在架构中添加默认键并将其值添加到Date.now()

答案 4 :(得分:0)

如果您使用时间戳数据进行查询。 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”