如何在mongodb中嵌套求和
我有这个计划:如何在mongodb中嵌套求和,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有这个计划: [{ 姓名:'约翰', 播放:[{ 帕纳姆:1, 歌曲:{ 长度:400, 参数:“a” } }, { 帕纳姆:2, 歌曲:{ 长度:350, 参数:“a” } }, { playNum:3, 歌曲:{ 长度:211, 参数:“a” } ] }, { 姓名:'约翰', 播放:[{ 帕纳姆:2, 歌曲:{ 长度:400, 参数:“a” } }, { playNum:3, 歌曲:{ 长度:350, 参数:“a” } }, { playNum:4, 歌曲:{ 长度:211, 参数:“a
[{
姓名:'约翰',
播放:[{
帕纳姆:1,
歌曲:{
长度:400,
参数:“a”
}
}, {
帕纳姆:2,
歌曲:{
长度:350,
参数:“a”
}
}, {
playNum:3,
歌曲:{
长度:211,
参数:“a”
}
]
},
{
姓名:'约翰',
播放:[{
帕纳姆:2,
歌曲:{
长度:400,
参数:“a”
}
}, {
playNum:3,
歌曲:{
长度:350,
参数:“a”
}
}, {
playNum:4,
歌曲:{
长度:211,
参数:“a”
}
]
}
]
我想计算具体比赛的时间
i、 e.对于第二出戏——我们有350首歌中的一首,400首歌中的另一首=750
我试着这样做:
聚合(
{$match:{“shows.showNum”:showNum},
{$unwind:“$shows”},
{$group:{{u id:$shows.showNum”,总长度:{$sum:$shows.song.length})
但通过这种方式,我得到了在那个节目中演奏的所有歌曲的总数
有人能帮忙吗
谢谢!您的第一个仅与数组中包含该值的“文档”匹配。要真正“过滤”数组内容,您需要在管道中添加另一个:
db.collection.aggregate([
{“$match”:{“plays.playNum”:playNum},
{“$REWIND”:“$plays”},
{“$match”:{“plays.playNum”:playNum},
{“$组”:{
“_id”:“$plays.playNum”,
“总长度”:{“$sum”:“$plays.song.length”}
}}
])
如果您使用的是MongoDB 2.6或更高版本,那么实际上可以使用操作符和其他辅助操作符过滤阵列:
db.collection.aggregate([
{“$match”:{“plays.playNum”:playNum},
{“$project”:{
“戏剧”:{
“$setDifference”:[
{
“$map”:{
“输入”:“$plays”,
“as”:“el”,
“在”:{
“$cond”:[
{“$eq”:[“$$el.playNum”,playNum]},
“$$el”,
假的
]
}
}
],
[错误]
]
}
}},
{“$REWIND”:“$plays”},
{“$组”:{
“_id”:“$plays.playNum”,
“总长度”:{“$sum”:“$plays.song.length”}
}}
])
通过组合不同阶段的函数,这会使事情变得更快。它看起来更复杂,但实际上是处理最终结果的最快方式。您使用
shows
和shownum
进行聚合。您是指plays和playnum吗?show
和shownum
在您的模式中不存在在这些剧本中,你有三首歌,结果是400+350+211=961。
db.collection.aggregate([
{$unwind: '$plays'},
{$match: {"plays.playNum" : 2} },
{$group: {
_id: null,
"suma": {$sum: "$song.length" }
}}
])