mongodb - 计算 MonogDb 文档中数组字段内的对象数量
问题描述
如何在某个字段中将具有相同 id 的所有文档分组,并计算其中一个字段内数组的长度。
就像我下面的例子一样,结果应该是:
{
movieId: ("5b79b8387d467d5ab860544f")
takenSeats : 46
}
{
movieId : ("5b79b9277d467d5ab8605454")
takenSeats : 11
}
{
movieId : ("5b79b8927d467d5ab8605451")
takenSeats: 17
}
这就是我开始聚合的方式:
db.orders.aggregate([
{ $match:{ "created":{$gt: new Date(ISODate().getTime() - 1000*60*60*24*15)}}},
{ $lookup: { from: "shows", localField: "showId", foreignField: "_id", as: "acociatedShow" }},
{ $unwind: "$acociatedShow" }, { $replaceRoot: { newRoot: "$acociatedShow" } },
{ $group: {_id: '$_id' ,movieId: { $first: '$movie' },takenSeats: { $first: '$takenSeats' }}},
])
[编辑]
结果使用:
db.orders.aggregate([
{ $match:{ "created":{$gt: new Date(ISODate().getTime() - 1000*60*60*24*15)}}},
{ $lookup: { from: "shows", localField: "showId", foreignField: "_id", as: "acociatedShow" }},
{ $unwind: "$acociatedShow" }, { $replaceRoot: { newRoot: "$acociatedShow" } },
{ $group: {_id: '$movie',takenSeats: { $sum: {$size:'$takenSeats' }}}}
])
$push
我通过这个查询得到了想要的结果,但问题是我可以在没有运算符的情况下让它更短
db.orders.aggregate([
{ $match:{ "created":{$gt: new Date(ISODate().getTime() - 1000*60*60*24*15)}}},
{ $lookup: { from: "shows", localField: "showId", foreignField: "_id", as: "acociatedShow" }},
{ $unwind: "$acociatedShow" }, { $replaceRoot: { newRoot: "$acociatedShow" } },
{ $group: {_id: '$_id' ,movieId: { $first: '$movie' },takenSeats: { $first: '$takenSeats' }}},
{ $unwind: "$takenSeats" },
{ $group:{ _id: "$movieId","takenSeats":{"$push": "$takenSeats"}}},
])
解决方案
推荐阅读
- python - 使用 Q 对象的 Django AND 查询
- three.js - Three.js 模型在移动端错位
- php - Composer 版本匹配错误 laravel + spatie medialibrary
- php - 仅根据 PHP 中的 if 语句回显某些内容
- python - Python Flask 生成文本文件
- azure - Azure/Microsoft.Automation AutomationAccounts/schedules 间隔属性示例
- r - 创建包含缺失值行位置的数据框
- reactjs - React-如何在另一个反应组件中使用 GeoLocation 类
- neural-network - 如何为神经网络提供输出,以使用高斯策略方法对连续动作进行采样?
- node.js - react-scripts 使用旧版本的 node 和带有 SSL 的 npm 开始崩溃