使用 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【讨论】:
结合momentjsItems.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 插入和获取值