根据日期分类数据

时间:2018-08-18 06:54:36

标签: node.js mongodb express mongoose

我有一个看起来像这样的MongoDB集合

source1 < souce2
or
source1 == source2 and target1 < target2

这表示两个用户之间的交易。 我想做的是按日期对数据进行分类。

因此,如果我在15-05-2018有三笔交易,在2018年5月16日有四笔交易,我想将它们分组

const TransactionSchema = mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  },
  transactionType: {
    type: String,
    enum: [transactionTypes.TRANSACTION_EXPENSE, transactionTypes.TRANSACTION_INCOME],
    required: true
  },
  amount: {
    type: Number,
    required: true
  },
  paymentType: {
    type: String,
    enum: [
      transactionPaymentTypes.PAYMENT_CARD,
      transactionPaymentTypes.PAYMENT_CASH
    ],
    required: true
  },
  createdDate: {
    type: Date,
    default: Date.now
  },
  description: String,
  tags: [String]
});

PS。为了方便起见,我写了15-05-2018。实际上,数据将是时间戳。

如何进行这项工作?

我四处搜寻,发现应该使用mongoose / mongodb的聚合功能,但是我不明白如何使它工作。

注意: 我正在将NodeJS,ExpressJS和MongoDB与Mongoose结合使用。

1 个答案:

答案 0 :(得分:0)

这是使用聚合框架解决猫鼬问题的方法,因为您没有表示要匹配Transaction模型上的任何条件。您可以将日期格式化为问题中使用的示例。

Transaction.aggregate([
  { 
     "$addFields": {
        "createdDate": {
           $dateToString: { format: "%d-%m-%Y", date: "$createdDate" }
        }
     }
  },
  { 
     "$group": {
        "_id": { "$createdDate" },
        "transactions": {
            "$push": "$$ROOT"
        }
     }
  }])

这些是mongodb doc网站上的一些参考资料,可帮助您更好地理解聚合。

DateToStringGroupPush

我也建议您将mongodb documentation site用于大多数参考,因为它包含许多有用的信息,可帮助您轻松理解这些概念。