Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
如何在mongodb中嵌套求和_Mongodb_Aggregation Framework - Fatal编程技术网

如何在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" }
    }}
])