【发布时间】:2021-10-18 04:25:43
【问题描述】:
您好,我正在创建一个项目,根据其类别显示所有硬币的 PopulationCount 数据中的用户变化。
我创建了一个 NodeJS 脚本来从一个硬币网站上抓取数据,并将其保存在我的 MongoDB 云数据库中,如下所示。
在前端,我创建了一个 React 应用程序,如下所示: 当用户点击一个硬币类别时,它应该显示今天的所有硬币
这是与显示我的路线中所有硬币类别相关的代码:
router.get(
"/categories",
asyncHandler(async (req, res) => {
const categories = await Coin.find().distinct(
"category",
(err, results) => {
res.json(results);
}
);
})
);
我的生活遇到了最大的问题/麻烦,因为我需要在此文档中添加新属性,以计算 PopulationCount 与今天日期和昨天日期之间的差异,然后将这个新的“趋势”属性添加到文档中。
这样我就可以显示今天日期的硬币数据和计算出的“趋势”属性,以确定它的价值是减少还是增加。
我怎样才能做到这一点?到目前为止,我已经编写了这段代码,但我不知道从哪里开始。
router.get(
"/categories/:category",
asyncHandler(async (req, res) => {
const { category } = req.params;
const fullName = category.replace(/-/g, " ");
// todays coins
const today = new Date(Date.now());
today.setHours(0, 0, 0, 0);
const todaysCoins = await Coin.find({
category: {
$regex: new RegExp(fullName, "i"),
},
createdAt: {
$gte: today,
},
}).lean();
res.json(todaysCoins);
// loop thru all todays coins
// compare to yesterdays coins
// loop thru array of today and compare to yesterday and add trend
})
// loop through yesterdays coins
const startYest = new Date(Date.now());
startYest.setHours(0, 0, 0, 0);
const oneDayAgo = startYest.getDate() - 1;
startYest.setDate(oneDayAgo);
const endYest = new Date(Date.now());
endYest.setHours(23, 59, 59);
const endYestDayAgo = endYest.getDate() - 1;
endYest.setDate(endYestDayAgo);
const yesterdayCoins = await Coin.find({
category: {
$regex: new RegExp(fullName, "i"),
},
createdAt: {
$gte: startYest,
$lt: endYest,
}
}).lean()
);
【问题讨论】:
-
MongoDB 不允许你动态添加属性到模型中,我的建议是,第一次创建模型时,将
Trend属性添加到默认值,然后计算差异只是更新Trend值。 -
我对猫鼬完全不熟悉,但是可以用
$addFields和聚合:docs.mongodb.com/manual/reference/operator/aggregation/…来完成吗?