【问题标题】:Statistics with Mongo DB使用 Mongodb 进行统计
【发布时间】:2021-10-07 19:55:31
【问题描述】:

我有以下数据库结构:

{
    "uploadedAt": "2021-09-22T22:09:12.133Z",
    "paidAt: "2021-09-30T22:09:12.133Z",
    "amount": {
        "currency": "EUR",
        "expected": 70253,
        "paid": 0
    },
}

我想知道如何计算仍需支付的总金额(预期 - 已支付),以及从 uploadAt 到paidAt 的平均日期。这适用于多条记录。

我获取数据的功能是(应更新标准以获取此数据)。

const invoiceParams = new FindParams();
invoiceParams.criteria = { company: company._id }

const invoices = await this.findAll(invoiceParams);

FindAll 函数如下所示:

  async findAll(
    params: FindParams,
    ability?: Ability,
    includeDeleted: boolean = false,
  ): Promise<Entity[]> {
    let queryCriteria: Criteria = params.criteria;
    let query: DocumentQuery<Entity[], Entity> = null;

    if (!includeDeleted) {
      queryCriteria = {
        ...queryCriteria,
        deleted: { $ne: true },
      };
    }

    try {
      if (ability) {
        ability.throwUnlessCan('read', this.entityModel.modelName);

        queryCriteria = {
          ...toMongoQuery(ability, this.entityModel.modelName),
          ...queryCriteria,
        };
      }

      query = this.entityModel.find(queryCriteria);

      if (params.populate) {
        query = query.populate(params.populate);
      }

      if (params.sort) {
        query = query.sort(params.sort);
      }

      if (params.select) {
        query = query.select(params.select);
      }

      return query.exec();
    } catch (error) {
      if (error instanceof ForbiddenError) {
        throw new ForbiddenException(error.message);
      }

      throw error;
    }
  }

更新:

const paymentTime = await this.invoiceModel.aggregate([
      {
          $group: {
              _id: "$account",
              averageSpread: { $avg: { $subtract: ["$paidAt", "$uploadedAt"] } },
              count: { $sum: 1 }
          }
      }
  ]);

【问题讨论】:

    标签: mongodb mongodb-query nestjs


    【解决方案1】:

    试试这个聚合管道:

    db.invoiceParams.aggregate([
       {
          $set: {
             expectedPaid: { $subtract: ["$amount.expected", "$amount.paid"] },
             averageDate: { $toDate: { $avg: [{ $toLong: "$uploadedAt" }, { $toLong: "$paidAt" }] } }
          }
       }
    ])
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 2022-06-23
      • 2017-05-22
      • 1970-01-01
      • 2016-10-09
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多