为什么 mongoDB 不会更新我的用户条目的“日期”字段?

use*_*775 5 mongoose mongodb node.js reactjs

我在我的 React 应用程序中创建了一个用户架构,如下所示:

const userSchema = new Schema(
{
profileId: String,
expirationDate: { type: Date, default: new Date() },
credits: { type: Number, default: 0 },
},
{ timestamps: { createdAt: "created_at" } }
);
Run Code Online (Sandbox Code Playgroud)

当用户向我付款时,我想通过 post 方法重置/更新两个字段:expirationDate 和 credits。这是我在 expressjs 后端服务器上用于更新 MongoDB Atlas 上的数据库条目的代码:

req.user.expirationDate = new Date(
req.user.expirationDate.setDate(req.user.expirationDate.getDate() + 30)
);
req.user.credits += 1;
const user = await req.user.save();

res.send(user);
Run Code Online (Sandbox Code Playgroud)

一旦操作成功,我可以看到“credits”字段被更新(增加了1)。但是,“expirationDate”字段保持不变。更奇怪的是,当我使用“res.send(user)”将更新的用户对象发送到我的前端服务器时,我可以在控制台中看到更新的到期日期。

按设计/预期成功更新用户模型:从前端控制台看到

但下面是我在 mongoDB 中看到的:

更新了 MongoDB 中的用户条目:日期字段“expirationDate”未更新;但是,“学分”字段是。

这里发生了什么?如何解决?

eol*_*eol 2

我最近遇到了类似的问题,还没有弄清楚这背后的实际原因,但作为一种解决方法,请尝试明确告诉 mongoose - 字段expirationDate已更改:

req.user.expirationDate = new Date(
    req.user.expirationDate.setDate(req.user.expirationDate.getDate() + 30)
);
req.user.markModified('expirationDate');
await req.user.save();
Run Code Online (Sandbox Code Playgroud)

编辑:

只是再次调试它,我认为这种行为背后的原因是您defaultexpirationDate. 尝试将Date.now函数传递给它,而不是立即将其设置为新日期:

expirationDate: {type: Date, default: Date.now},
Run Code Online (Sandbox Code Playgroud)

这为我解决了这个问题,而无需使用markModified().