我使用MongoDB,Nodejs和ExpressJS制作API。我有一个名为Membership的集合
const membershipSchema = new Schema(
{
membership_id: {
type: Number,
required: [true, "ID is required"],
unique: true,
},
member_detail: [{ type: Schema.Types.ObjectId, ref: "user" }],
validity: {
type: Number,
enum: [30, 90, 180, 365],
required: true,
},
fee: {
type: Number,
required: [true, "fee is required"],
},
registration_fee: {
type: Number,
required: [true, "registration fee is required"],
},
total_fee: {
type: Number,
required: [true, "total_fee fee is required"],
},
// status: {
// type: Boolean,
// required: [true, "status fee is required"],
// },
startDate: {
type: Date,
required: [true, "Start date is required"],
},
endDate: {
type: Date,
required: [true, "End date is required"],
},
added_by: { type: String, required: true },
last_update: {
type: Date,
default: Date.now,
},
}
);
添加成员身份并使用GET请求后,我得到以下响应
{
"member_detail": [
{
"_id": "5ea1e43dd401c828f4d1cf7d",
"name": "member421"
}
],
"_id": "5ea1e4a3d401c828f4d1cf7f",
"last_update": "2020-04-23T18:55:31.311Z",
"membership_id": 421,
"added_by": "admin",
"validity": 30,
"fee": 3500,
"registration_fee": 500,
"total_fee": 4000,
"startDate": "2020-04-18T06:21:04.869Z",
"endDate": "2020-07-18T06:21:04.869Z",
"createdAt": "2020-04-23T18:55:31.313Z",
"updatedAt": "2020-04-23T18:55:31.313Z",
"__v": 0
}
现在,我正在向成员资格集合发送另一个GET请求,并带有查询以测试并获取两个日期(endDate-当前日期(24/04/2020))与其正常工作之间的差额,并给出以下响应
router.route("/alert").get((req, res) => {
Membership.aggregate(
[
{
$project: {
dayssince: {
$trunc: {
$divide: [
{ $subtract: ["$endDate", new Date()] },
1000 * 60 * 60 * 24,
],
},
},
},
},
],
(err, document) => {
if (err) {
return res.status(404).json({ error: true, message: err });
}
res.status(200).json({ data: document });
}
);
});
上面的代码将这个结果返回给我
{
"data": [
{
"_id": "5ea1e4a3d401c828f4d1cf7f",
"dayssince": 85
}
]
}
现在,我想为我创建的每个成员合并以上结果
预期产量
{
"member_detail": [
{
"_id": "5ea1e43dd401c828f4d1cf7d",
"name": "member421"
}
],
"_id": "5ea1e4a3d401c828f4d1cf7f",
"last_update": "2020-04-23T18:55:31.311Z",
"membership_id": 421,
"added_by": "admin",
"validity": 30,
"fee": 3500,
"registration_fee": 500,
"total_fee": 4000,
"startDate": "2020-04-18T06:21:04.869Z",
"endDate": "2020-07-18T06:21:04.869Z",
"createdAt": "2020-04-23T18:55:31.313Z",
"updatedAt": "2020-04-23T18:55:31.313Z",
"__v": 0
**"dayssince": 85**
}
我遇到了聚合函数,但是我不知道如何在查询中实现。如果您需要项目中的其他代码,请随时发表评论。
答案 0 :(得分:1)
为什么要求数据库只是为了计算时间差?
一旦有了第一个结果,为什么不立即进行数学运算呢?
// The result of the first query to DB
let firstResult = {
"member_detail": [
{
"_id": "5ea1e43dd401c828f4d1cf7d",
"name": "member421"
}
],
"_id": "5ea1e4a3d401c828f4d1cf7f",
"last_update": "2020-04-23T18:55:31.311Z",
"membership_id": 421,
"added_by": "admin",
"validity": 30,
"fee": 3500,
"registration_fee": 500,
"total_fee": 4000,
"startDate": "2020-04-18T06:21:04.869Z",
"endDate": "2020-07-18T06:21:04.869Z",
"createdAt": "2020-04-23T18:55:31.313Z",
"updatedAt": "2020-04-23T18:55:31.313Z",
"__v": 0
}
// NOW
let now = new Date();
// Create a date object from the endDate found in the DB result
let endDate = new Date(firstResult.endDate);
// Calculate the difference in rounded days
let result = Math.round((endDate-now) / (1000*60*60*24));
// Output
console.log(result)
// Then... Yes, you can add this to the initial response object
firstResult.dayssince = result;
console.log(firstResult)