从对象中的日期创建月键

creating month key from date in objects

这是我的数据:

{
"_id": ObjectId("6213ba90a013b7c5f1232e1f"),
"name": "name1",
"surname": "surname1",
"newArray": {
      "buyDate": ISODate("1975-11-04T13:14:15Z"),
      "carCount": 3,
      "name": "name1",
      "surname": "surname1"
    }
},
{
"_id": ObjectId("6213ba90a013b7c5f1232e2f"),
"name": "name2",
"surname": "surname2",
"newArray": {
      "buyDate": ISODate("1978-12-07T15:30:15Z"),
      "carCount": 7,
      "name": "name2",
      "surname": "surname2"
    }
},
{
"_id": ObjectId("6213ba90a013b7c5f1232e3f"),
"name": "name3",
"surname": "surname3",
"newArray": {
      "buyDate": ISODate("1983-11-12T18:40:15Z"),
      "carCount": 4,
      "name": "name3",
      "surname": "surname3"
    }
}

我想按购买月份计算汽车数量。首先,我想找到所有“newArray”的购买月份,然后添加到所有“newArray”。我的意思是:

{
"_id": ObjectId("6213ba90a013b7c5f1232e1f"),
"name": "name1",
"surname": "surname1",
"newArray": {
      "buyDate": ISODate("1975-11-04T13:14:15Z"),
      "carCount": 3,
      "name": "name1",
      "surname": "surname1",
      "buyMonth": 11
    }
},
{
"_id": ObjectId("6213ba90a013b7c5f1232e2f"),
"name": "name2",
"surname": "surname2",
"newArray": {
      "buyDate": ISODate("1978-12-07T15:30:15Z"),
      "carCount": 7,
      "name": "name2",
      "surname": "surname2",
      "buyMonth": 12
    }
},
{
"_id": ObjectId("6213ba90a013b7c5f1232e3f"),
"name": "name3",
"surname": "surname3",
"newArray": {
      "buyDate": ISODate("1983-11-12T18:40:15Z"),
      "carCount": 4,
      "name": "name3",
      "surname": "surname3",
      "buyMonth": 11
    }
}

最后我会根据他们的购买月份来计算汽车数量。我试过了,但没有得到任何结果:

db.collection.aggregate([
  {
    $set: {
      "newArray.buyMonth": "$buyDate.month"
    }
  },
  {
    "$group": {
      "_id": "$buyMonth",
      "carCountByMonth": {
        "$count": "newArray"
      }
    }
  }
])

我怎样才能得到我想要的?提前致谢。

  1. 要从日期中获取月份,请使用 $month 运算符。
  2. 要获得 newArray.buyDate,请使用 newArray.buyDate 而不是 buyDate
  3. $group newArray.buyMonth 但不是 buyMonth.
  4. 使用$sum计算所有newArray.carCount的总和而不是$count
db.collection.aggregate([
  {
    $set: {
      "newArray.buyMonth": {
        $month: "$newArray.buyDate"
      }
    }
  },
  {
    "$group": {
      "_id": "$newArray.buyMonth",
      "carCountByMonth": {
        "$sum": "$newArray.carCount"
      }
    }
  }
])

Sample Mongo Playground