Javascript 有没有一种方法可以计算猫鼬中具有特定截止日期的不同值

Javascript 有没有一种方法可以计算猫鼬中具有特定截止日期的不同值,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,例如,我有以下两个文档 [ { "_id": "5fc534505144dd0030c44f8e", "createdAt": "2020-12-14T15:11:21.327Z" "user_id": "2", }, { "_id": "5fc534505144dd0030c44f8e",

例如,我有以下两个文档

[
   {
    "_id": "5fc534505144dd0030c44f8e",
    "createdAt": "2020-12-14T15:11:21.327Z"
    "user_id": "2",
  },
  {
    "_id": "5fc534505144dd0030c44f8e",
    "createdAt": "2020-12-14T14:10:40.427Z",
    "user_id": "1"
  },
  {
    "_id": "5fc534595144dd0030c44f95",
    "createdAt": "2020-12-13T14:10:58.027Z",
    "user_id": "1"
  }
]
结果应该是

[
  {
    "date": "2020-12-13",
    "count":1
  },
  {
    "date": "2020-12-14",
    "count":2
  }
  ]
其中,计数是在特定截止日期之前,通过用户ID的不同文档的数量

给定数据

data=[
   {
    "createdAt": "2020-12-14T15:11:21.327Z",
    "user_id": "2",
  },
  {
    "createdAt": "2020-12-14T14:10:40.427Z",
    "user_id": "1"
  },
  {
    "createdAt": "2020-12-13T14:10:58.027Z",
    "user_id": "1"
  },{
    "createdAt": new Date("2020-12-14T14:10:58.027Z"),
  }
]
> db.dummy.insert(data)
您可以使用聚合:与_id为日期的日期一起使用)


编辑:猫鼬智慧同样可能成立

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/dummy')

const UDate = mongoose.model('X', { createdAt:String, user_id: String }, 'dummy')

;(async()=>{
  mongoose.set('debug', true)
  const group = {$group:{_id:{$substr:['$createdAt', 0, 10]}, count:{$sum:1}}}
  const v = await UDate.aggregate([group])
  console.log('s : ', JSON.stringify(v))
  mongoose.disconnect()
})()
edit2:为了处理用户标识的唯一性,以便每个日期不计算两次,您可以使用,而不是使用sum,然后使用

最后,如果您感觉总是更多,您可以在投影期间将_id字段“重命名”为date

{$project:{date:'$_id', _id:0, count: {$size: '$userIds'}} }
  • $gorup
    createdAt
    使用
    $substr
    获取子字符串后的日期,并在
    $addToset
    的基础上创建唯一用户ID数组
  • 使用
    $size

我只需要计算用户id的不同数字,而不是总和;),这应该给出一个计数:2对于14-12我现在没有时间,在组管道中,您可以使用带有用户id的addToSet,而不是sum,然后添加另一个采用集合大小的$project管道。我最终会在稍后更新答案@Ibrahimshamma:)

  const group = {$group:{_id:{$substr:['$createdAt', 0, 10]}, userIds:{$addToSet:'$user_id'}}}
  const count = {$project:{date:'$_id', count: {$size: '$userIds'}} }
  const v = await Stock.aggregate([group, count])
{$project:{date:'$_id', _id:0, count: {$size: '$userIds'}} }
db.collection.aggregate([
  {
    $group: {
      _id: { $substr: ["$createdAt", 0, 10] },
      count: { $addToSet: "$user_id" }
    }
  },
  { $addFields: { count: { $size: "$count" } } }
])