将两个结果合并为一个结果-mongodb

时间:2020-04-23 19:31:25

标签: node.js mongodb express

我使用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**
        }

我遇到了聚合函数,但是我不知道如何在查询中实现。如果您需要项目中的其他代码,请随时发表评论。

1 个答案:

答案 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)