Nodejs mongodb查询某一天的文章

Nodejs mongodb查询某一天的文章

在做一个论坛差不多的网站,想要完成点击一个日期,就显示该天所有的文章

一条document如下

{
    "_id" : ObjectId("52de56e5cb2853080a04ba05"),
    "bad" : 0,
    "category" : "2",
    "content" : "<p>werqre</p>",
    "expire" : null,
    "good" : 0,
    "pid" : 7,
    "tags" : [],
    "time" : ISODate("2014-01-21T11:15:44.733Z"),
    "title" : "rqwer",
    "user" : "ceclinux"
}

请问如何在nodejs中查询2014年1月21日的文章,我不会写关键的查询语句

还是我数据库设计的有问题?


8 回复

要在Node.js中使用MongoDB查询特定日期的文章,你可以使用Mongoose库来简化操作。假设你已经有一个名为Article的Mongoose模型,它对应于你的文档结构。

示例代码

首先,确保你已经在项目中安装了Mongoose:

npm install mongoose

然后,创建一个简单的Mongoose模型,并编写查询函数来获取特定日期的文章。

步骤1: 创建Mongoose模型

const mongoose = require('mongoose');

// 定义Schema
const articleSchema = new mongoose.Schema({
    title: String,
    content: String,
    time: { type: Date, default: Date.now },
    // 其他字段...
});

// 创建Model
const Article = mongoose.model('Article', articleSchema);

module.exports = Article;

步骤2: 编写查询函数

const Article = require('./models/Article'); // 假设你的模型文件在models目录下

async function getArticlesByDate(date) {
    try {
        const articles = await Article.find({
            time: {
                $gte: new Date(date.setHours(0, 0, 0, 0)),
                $lt: new Date(date.setHours(23, 59, 59, 999))
            }
        });
        return articles;
    } catch (error) {
        console.error(error);
        throw error;
    }
}

// 使用示例
const date = new Date('2014-01-21');
getArticlesByDate(date)
    .then(articles => {
        console.log(articles);
    })
    .catch(error => {
        console.error('Error fetching articles:', error);
    });

解释

  1. 定义Schema:我们定义了一个包含title, content, 和 time等字段的Schema。
  2. 创建Model:使用mongoose.model方法创建一个名为Article的Model。
  3. 查询函数
    • getArticlesByDate 函数接受一个日期参数。
    • 使用$gte(大于等于)和$lt(小于)操作符来查询指定日期的所有记录。
    • $gte 使用该日期的开始时间(即午夜),而 $lt 使用该日期的结束时间(即23:59:59.999),以确保整个日期范围内的所有记录都被捕获。

这种方法可以有效地查询特定日期的所有文章,同时避免了由于时间戳精确性带来的问题。


mongo shell我会用

db.posts.find({time:{"$gte":new ISODate('2014-01-24'),"$lt":new ISODate('2014-01-25')}})

但是nodejs没有ISODate吧,而且这种方法感觉不好

我也很想知道!

_id 本身就包含了时间

a 4-byte value representing the seconds since the Unix epoch

是这个吧,但是用来查询处理就不方便了

这个问题怎么感觉无解了,试了网上所有的方案

怪不得搜索不到 因为js里面有这种区别,浪费了我大把时间

new Date(2014,1,24) 
Mon Feb 24 2014 00:00:00 GMT+0800 (CST) 
new Date("2014-1-24") 
Fri Jan 24 2014 00:00:00 GMT+0800

这是设计失误吗?

要在Node.js中使用MongoDB查询特定日期的文章,你可以使用find方法,并传入适当的查询条件。根据你提供的文档格式,可以使用$eq操作符来精确匹配日期。以下是一个示例代码,假设你已经设置好了MongoDB连接:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/'; // 数据库地址
const dbName = 'yourDatabaseName'; // 数据库名称

MongoClient.connect(url, function(err, client) {
  if (err) throw err;
  const db = client.db(dbName);
  const collection = db.collection('articles'); // 文章集合名称

  const query = { time: new Date("2014-01-21") };

  collection.find(query).toArray(function(err, docs) {
    if (err) throw err;
    console.log(docs); // 打印查询结果
    client.close();
  });
});

这段代码做了以下几件事:

  1. 连接到MongoDB服务器。
  2. 选择你要操作的数据库。
  3. 定义一个查询条件,用于查找time字段等于指定日期的文章。
  4. 使用find方法执行查询并获取所有符合查询条件的文档。
  5. 将结果打印到控制台。

如果你希望用户可以通过点击日期来查看该天的所有文章,可以在你的前端应用中添加一个事件处理器,当用户点击日期时触发后端API,该API会接收日期参数并返回该日期的文章列表。

回到顶部