Nodejs中mongodb怎么通过date取得document

Nodejs中mongodb怎么通过date取得document

我在mongo中存了一些数据,其中有一个字段是Date类型的。 data

现在需要取得特定时间的数据不成功

collection.findOne({
'user': username,
'title': title,
'time' : new Date(time)
}, function(err, doc) {
......
}

网上只有取得date range的方法 mongodb cookbook


5 回复

Nodejs中mongodb怎么通过date取得document

在MongoDB中,有时我们需要根据具体的日期来查询文档。虽然官方文档中主要介绍了如何通过日期范围来查询文档,但如果你只需要根据一个特定的日期进行查询,也可以通过一些技巧来实现。

假设你存储了一些数据,其中一个字段是time类型为Date。现在你需要获取某个特定日期的数据。以下是一个简单的示例代码,展示如何通过特定日期查询文档。

示例代码

首先,确保你已经安装了MongoDB的Node.js驱动程序(mongodb):

npm install mongodb

然后你可以使用以下代码来查询特定日期的文档:

const { MongoClient } = require('mongodb');

async function findDocumentBySpecificDate() {
    const uri = "your_mongodb_connection_string"; // 替换为你的MongoDB连接字符串
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        await client.connect();
        const database = client.db('your_database_name'); // 替换为你的数据库名称
        const collection = database.collection('your_collection_name'); // 替换为你的集合名称

        // 特定的日期
        const specificDate = new Date("YYYY-MM-DD"); // 替换为你想要查询的具体日期

        // 查询条件
        const query = {
            'user': 'username', // 替换为你要查询的用户名
            'title': 'title',   // 替换为你要查询的标题
            'time': {
                $gte: new Date(specificDate.setHours(0, 0, 0, 0)), // 当天开始时间
                $lt: new Date(specificDate.setHours(23, 59, 59, 999)) // 当天结束时间
            }
        };

        // 执行查询
        const doc = await collection.findOne(query);
        console.log(doc);
    } catch (err) {
        console.error("Error:", err);
    } finally {
        await client.close();
    }
}

findDocumentBySpecificDate();

解释

  1. 连接到MongoDB:使用MongoClient连接到你的MongoDB实例。
  2. 指定数据库和集合:选择你要查询的数据库和集合。
  3. 构建查询条件
    • usertitle 是其他两个查询条件。
    • time 字段通过$gte$lt操作符来定义一个日期范围。这样可以确保查询的是当天的文档。
  4. 执行查询:使用findOne方法来获取符合条件的第一个文档。
  5. 关闭连接:在操作完成后关闭与MongoDB的连接。

这种方法利用了日期范围查询的方式,但由于我们只关心一天中的某一天,所以设置了一个从当天开始到当天结束的时间范围。这样就能准确地找到所需的文档。


找不到更好的办法,先用一个笨办法。 就用查找date range的方法: var start = new Date(parseInt(time)); var end = (new Date(parseInt(time)+1000:)); collection.findOne({ ‘time’ : {$gte :start, $lt: end} }, function(err, doc) { … }

-。 - 我在想啊,你不能直接把date转成number类型么?我通常在数据库里面都直接存时间戳的。

0.0 嗯嗯,时间戳试过是可以的。 刚学Node.js 本来想直接存取都用date,以前写java的时候别的数据库都是可以的,就自然而然觉得肯定是可以的,没想到不行。。


如果没有其他的方案的,只能存时间戳咯

要在Node.js中通过特定日期从MongoDB中查询文档,可以使用findOne方法,并且需要确保传递给查询的日期格式与数据库中的日期格式匹配。如果你存储的是精确到秒或毫秒的日期,那么直接使用new Date()构造函数可能会导致找不到匹配的文档。

假设你的time字段存储了具体的日期时间(例如2023-10-05T14:48:00.000Z),你可以这样查询:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'yourDatabaseName';

MongoClient.connect(url, function(err, client) {
    if (err) throw err;
    console.log("Connected to MongoDB");

    const db = client.db(dbName);
    const collection = db.collection('yourCollectionName');

    // 使用具体的日期时间查询
    const time = new Date('2023-10-05T14:48:00.000Z');
    
    collection.findOne({
        'user': username,
        'title': title,
        'time': time
    }, function(err, doc) {
        if (err) throw err;
        if (doc) {
            console.log(doc);
        } else {
            console.log('No document found with the specified date.');
        }
        client.close();
    });
});

如果数据库中存储的日期非常精确(如包含毫秒),而你在查询时没有提供毫秒部分,这可能会导致找不到匹配项。为了解决这个问题,你可以先在数据库中查找一个大致的时间范围,然后进一步缩小范围:

const start = new Date('2023-10-05T14:48:00.000Z');
const end = new Date(start.getTime() + 1000); // 增加1秒以包括可能的毫秒差异

collection.findOne({
    'user': username,
    'title': title,
    'time': { $gte: start, $lt: end }
}, function(err, doc) {
    if (err) throw err;
    if (doc) {
        console.log(doc);
    } else {
        console.log('No document found within the specified date range.');
    }
    client.close();
});

这种方法可以更灵活地处理日期精度问题。

回到顶部