Объединить два результата в один результат - mongodb - PullRequest
1 голос
/ 23 апреля 2020

Я создаю API с использованием MongoDB, Nodejs и ExpressJS. У меня есть коллекция с именем членство

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 - Current Date (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 голосов
/ 23 апреля 2020

Зачем запрашивать БД только для того, чтобы вычислить разницу во времени?

Как только вы получите свой первый результат ... Почему бы просто не сделать математику сразу?

// 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...