我需要帮助在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');
}
});
也没有回来。我做错了什么?
答案 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)
澄清。重要的是要知道:
这是一段工作代码片段,我们在其中进行一些日期操作以确保Mongo能够正确处理它。在这个例子中,我使用的是mongoose模块,并希望得到日期属性小于(即之前)作为myDate参数的日期的行的结果。
var inputDate = new Date(myDate.toISOString());
MyModel.find({
'date': { $lte: inputDate }
})
答案 2 :(得分:4)
我最近遇到了同样的问题,我想添加一些其他信息。
您可以通过两种方式插入日期:
示例:插入一个新对象并为其添加时间戳
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);
});
示例:
// 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”