Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongodb/mongoose子文档聚合查询_Node.js_Mongodb_Mongoose_Aggregation Framework - Fatal编程技术网

Node.js mongodb/mongoose子文档聚合查询

Node.js mongodb/mongoose子文档聚合查询,node.js,mongodb,mongoose,aggregation-framework,Node.js,Mongodb,Mongoose,Aggregation Framework,我需要使用mongoose聚合框架从我的模式中获得这个输出 我的模式 const innerSchema = mongoose.Schema({ responseTime: Number, day: String, hour: Number }) let logsSchema = mongoose.Schema({ name: { type: String, enum: ['visit', 'new-request', 'new-customer'] }, series:

我需要使用mongoose聚合框架从我的模式中获得这个输出

我的模式

const innerSchema = mongoose.Schema({
  responseTime: Number,
  day: String,
  hour: Number
})

let logsSchema = mongoose.Schema({
  name: { type: String, enum: ['visit', 'new-request', 'new-customer'] },
  series: { type: [innerSchema], default: [] }
})
Logs.aggregate([
    {
      $group: {
        _id: '$name',
        series: { "$push": "$$ROOT" }
      }
    },
    {
      $unwind: "$series"
    },
    {
      $addFields: {
        createdAt: '$series.createdAt'
      }
    },

    { $match: { createdAt: { $gt: lastWeekDate, $lt: date } } },
    {
      $group: {
        _id: {
          name: "$_id",
          day: "$series.day"
        },
        count: {
          $sum: 1
        }
      }
    },

    {
      $group: {
        _id: "$_id.name",
        series: {
          $addToSet: {
            name: "$_id.day",
            value: {
              $sum: "$count"
            }
          }
        },

      }
    },
    {
      $addFields: {
        createdAt: '$createdAt'
      }
    },

    {
      $project: {
        _id: 0,
        name: "$_id",
        series: "$series"
      }
    }
  ])
我需要的输出如下

        [{
            "name":"visit",
            "series": [
                {
                    "day": "Saturday",
                    "count": 50
                },
                {
                    "day": "Friday",
                    "count": 20
                }
            ]
         },
         {
            "name":"new-request",
            "series": [
                {
                    "day": "Saturday",
                    "count": 100
                },
                {
                    "day": "Friday",
                    "count": 4
                }
            ]
         }]
当前仍使用此聚合查询

  Logs.aggregate([
    {
      $group: {
        '_id': '$name',
        series: { $first: '$series' }
      }
    },
    { $unwind: '$series' },
    {
      "$group": {
        "_id": '$series.day',
        count: { $sum: 1 }
      }
    },
    { $limit: 7 }

  ])
其结果如下:

[
    {
        "_id": "Saterday",
        "count": 1
    },
    {
        "_id": "Friday",
        "count": 1
    },
    {
        "_id": "Sunday",
        "count": 5
    }
]
它缺少名称和系列字段

我需要的系列阵列仅限于前7个文档,以获取一周的数据

const innerSchema = mongoose.Schema({
  responseTime: Number,
  day: String,
  hour: Number
})

let logsSchema = mongoose.Schema({
  name: { type: String, enum: ['visit', 'new-request', 'new-customer'] },
  series: { type: [innerSchema], default: [] }
})
Logs.aggregate([
    {
      $group: {
        _id: '$name',
        series: { "$push": "$$ROOT" }
      }
    },
    {
      $unwind: "$series"
    },
    {
      $addFields: {
        createdAt: '$series.createdAt'
      }
    },

    { $match: { createdAt: { $gt: lastWeekDate, $lt: date } } },
    {
      $group: {
        _id: {
          name: "$_id",
          day: "$series.day"
        },
        count: {
          $sum: 1
        }
      }
    },

    {
      $group: {
        _id: "$_id.name",
        series: {
          $addToSet: {
            name: "$_id.day",
            value: {
              $sum: "$count"
            }
          }
        },

      }
    },
    {
      $addFields: {
        createdAt: '$createdAt'
      }
    },

    {
      $project: {
        _id: 0,
        name: "$_id",
        series: "$series"
      }
    }
  ])
感谢您的帮助

新建--->更新

这是原始数据集

const innerSchema = mongoose.Schema({
  responseTime: Number,
  day: String,
  hour: Number
})

let logsSchema = mongoose.Schema({
  name: { type: String, enum: ['visit', 'new-request', 'new-customer'] },
  series: { type: [innerSchema], default: [] }
})
Logs.aggregate([
    {
      $group: {
        _id: '$name',
        series: { "$push": "$$ROOT" }
      }
    },
    {
      $unwind: "$series"
    },
    {
      $addFields: {
        createdAt: '$series.createdAt'
      }
    },

    { $match: { createdAt: { $gt: lastWeekDate, $lt: date } } },
    {
      $group: {
        _id: {
          name: "$_id",
          day: "$series.day"
        },
        count: {
          $sum: 1
        }
      }
    },

    {
      $group: {
        _id: "$_id.name",
        series: {
          $addToSet: {
            name: "$_id.day",
            value: {
              $sum: "$count"
            }
          }
        },

      }
    },
    {
      $addFields: {
        createdAt: '$createdAt'
      }
    },

    {
      $project: {
        _id: 0,
        name: "$_id",
        series: "$series"
      }
    }
  ])
将其更新为一个简单的结构

      [
    {
        "_id": "5ea1770c165ece5a40af06ea",
        "name": "new-request",
        "day": "Saturday",
        "hour": 14,
        "createdAt": "2020-04-23T11:07:56.175Z",
        "updatedAt": "2020-04-23T11:07:56.175Z",
        "__v": 0
    },
    {
        "_id": "5ea17770165ece5a40af06eb",
        "name": "new-request",
        "day": "Thursday",
        "hour": 14,
        "createdAt": "2020-04-23T11:09:36.364Z",
        "updatedAt": "2020-04-23T11:09:36.364Z",
        "__v": 0
    },
    {
        "_id": "5ea17770165ece5a40af06ec",
        "name": "new-customer",
        "day": "Thursday",
        "hour": 14,
        "createdAt": "2020-04-23T11:09:36.984Z",
        "updatedAt": "2020-04-23T11:09:36.984Z",
        "__v": 0
    },
    {
        "_id": "5ea17771165ece5a40af06ed",
        "name": "visit",
        "day": "Thursday",
        "hour": 14,
        "createdAt": "2020-04-23T11:09:37.603Z",
        "updatedAt": "2020-04-23T11:09:37.603Z",
        "__v": 0
    },
    {
        "_id": "5ea17772165ece5a40af06ee",
        "name": "visit",
        "day": "Thursday",
        "hour": 14,
        "createdAt": "2020-04-23T11:09:38.207Z",
        "updatedAt": "2020-04-23T11:09:38.207Z",
        "__v": 0
    },
    {
        "_id": "5ea17772165ece5a40af06ef",
        "name": "visit",
        "day": "Saturday",
        "hour": 14,
        "createdAt": "2020-04-23T11:09:38.698Z",
        "updatedAt": "2020-04-23T11:09:38.698Z",
        "__v": 0
    },
    {
        "_id": "5ea17773165ece5a40af06f0",
        "name": "visit",
        "day": "Thursday",
        "hour": 14,
        "createdAt": "2020-04-23T11:09:39.247Z",
        "updatedAt": "2020-04-23T11:09:39.247Z",
        "__v": 0
    },
    {
        "_id": "5ea2dd44030d853950379007",
        "name": "visit",
        "day": "Friday",
        "hour": 15,
        "createdAt": "2020-04-24T12:36:20.867Z",
        "updatedAt": "2020-04-24T12:36:20.867Z",
        "__v": 0
    },
    {
        "_id": "5ea2dd56030d853950379008",
        "name": "visit",
        "day": "Friday",
        "hour": 15,
        "createdAt": "2020-04-24T12:36:38.297Z",
        "updatedAt": "2020-04-24T12:36:38.297Z",
        "__v": 0
    },
    {
        "_id": "5ea2dd58030d853950379009",
        "name": "visit",
        "day": "Friday",
        "hour": 15,
        "createdAt": "2020-04-17T00:36:40.583Z",
        "updatedAt": "2020-04-24T12:36:40.583Z",
        "__v": 0
    },
    {
        "_id": "5ea2dd58030d85395037900a",
        "name": "visit",
        "day": "Friday",
        "hour": 15,
        "createdAt": "2020-04-24T12:36:40.878Z",
        "updatedAt": "2020-04-24T12:36:40.878Z",
        "__v": 0
    }
]
在@AlexZeDim和一些调整的帮助下,我成功地让它工作了,但我在数据排序方面遇到了最后一个问题 我需要按createdAt对数据进行排序

const innerSchema = mongoose.Schema({
  responseTime: Number,
  day: String,
  hour: Number
})

let logsSchema = mongoose.Schema({
  name: { type: String, enum: ['visit', 'new-request', 'new-customer'] },
  series: { type: [innerSchema], default: [] }
})
Logs.aggregate([
    {
      $group: {
        _id: '$name',
        series: { "$push": "$$ROOT" }
      }
    },
    {
      $unwind: "$series"
    },
    {
      $addFields: {
        createdAt: '$series.createdAt'
      }
    },

    { $match: { createdAt: { $gt: lastWeekDate, $lt: date } } },
    {
      $group: {
        _id: {
          name: "$_id",
          day: "$series.day"
        },
        count: {
          $sum: 1
        }
      }
    },

    {
      $group: {
        _id: "$_id.name",
        series: {
          $addToSet: {
            name: "$_id.day",
            value: {
              $sum: "$count"
            }
          }
        },

      }
    },
    {
      $addFields: {
        createdAt: '$createdAt'
      }
    },

    {
      $project: {
        _id: 0,
        name: "$_id",
        series: "$series"
      }
    }
  ])
问题已解决


在原始数据集中:不是“星期六”,而是“星期六”。 如果你真的想要/需要
{$limit:7}
阶段,你可以在这个查询的末尾自己添加它,它会给出你所需要的:

db.collection.aggregate([
  {
    $unwind: "$series"
  },
  {
    $group: {
      _id: {
        name: "$_id",
        day: "$series.day"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id.name",
      series: {
        $addToSet: {
          day: "$_id.day",
          count: {
            $sum: "$count"
          }
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      name: "$_id",
      series: "$series"
    }
  }
])

请提供集合中的原始示例/数据集。因此,我不确定
。限制
部分。如果您的
series.day
字段的值为每周的当前日期,则简单分组阶段将为您提供所需的详细信息,因为一周中有7天不同。当您
限制(7)
时,您只显示最后7个值,而不是一周中的7个唯一日期。您可以尝试使用
$push
操作符,而不是第一个
$group
阶段的
$first
。在第一个小组阶段后检查结果。通过限制我需要过去7天的数据不是所有天的数据,我还添加了原始数据集,感谢您的回复@AlexzedimChanged$first to$push没有帮助@prasad_cool我感谢您的帮助,但是限制剂量工作我想我应该在序列记录中添加createdAt字段,此外,我还在使用mongoose,它在名称字段中投影文档id,再次感谢,如果您愿意,您可以删除
$project
阶段,您将拥有
\u id
:对于
访问/新请求
值,而不是
名称
,至于在模式中使用
时间戳:true
,这是一个好主意,但请记住mongo商店是如何约会的。如果是这样,您可以通过特殊的
操作符
$dayOfWeek
(或类似的smth)每次转换
日期
字段,以接收当前日期。此外,如果我可以获得一周的数据,其中如果计数0中有两天没有回访,而不是不显示它,如果您要删除
计数:0
字段,然后您需要使用
$cond
运算符,对于
计数:{$eq:0}
谢谢您为我指出了正确的方向,我已经设法解决了问题:D