{
"_id" : "357091057690735",
"lm" : "samsung",
"ldt" : "S",
"lmod" : "GT-I8552",
"lpf" : "A",
"losv" : "4.1.2",
"lavn" : "1.0",
"lc" : "Reliance",
"flog" : 1470414626.0,
"llog" : 1475234249.0,
"ts" : 15.0,
"tts" : 1869.0,
"_2016" : [
{
"tts" : 0.0,
"tse" : 1.0,
"_id" : 805.0
},
{
"tts" : 46.0,
"tse" : 1.0,
"_id" : 811.0
},
{
"tts" : 288.0,
"tse" : 2.0,
"_id" : 815.0
},
{
"tts" : 350.0,
"tse" : 4.0,
"_id" : 816.0
},
{
"tts" : 18.0,
"tse" : 1.0,
"_id" : 819.0
},
{
"tts" : 849.0,
"tse" : 2.0,
"_id" : 829.0,
"te" : 3.0
},
{
"tts" : 122.0,
"tse" : 1.0,
"_id" : 920.0,
"tce" : 2.0,
"te" : 3.0
},
{
"tts" : 27.0,
"tse" : 1.0,
"_id" : 928.0,
"tce" : 2.0
},
{
"tts" : 4.0,
"tse" : 1.0,
"_id" : 930.0
}
],
"_2017" : [
{
"tts" : 10.0,
"tse" : 10.0,
"_id" : 805.0
}
]
}
这是我的mongodb文件。我希望2016年的总和(tts)+ 2017年的总和(tts)与条件_2016.tts> = 801和_2016.tts< = 1231)和 _2017.tts> = 801和2017.tts< = 1231)。我写了这个查询
db.coll_users1.aggregate([
{$unwind:"$_2016"},
{$unwind:"$_2017"},
{$match:{
$and:[
{$and:[ {'_2016._id': {$gte:801} },{'_2016._id': {$lte:1231}} ] },
{$and:[ {'_2017._id': {$gte:801} },{'_2017._id': {$lte:1231}} ] }
]
}
},
{$group: {
_id:'null',
tts16: {$sum: '$_2016.tts'},
tse16: {$sum: '$_2016.tse'},
tts17: {$sum: '$_2017.tts'},
tse17: {$sum: '$_2017.tse'}
} }
])
但它为tts_2017提供了错误的值
答案 0 :(得分:1)
那是因为你放松2,放松_2017是第二,因此它们会出现乘以_2016大小。
这些查询可帮助您根据2016数组大小划分值,以便获得正确的结果:
db.coll_users1.aggregate([
{$project: {_2016:1, _2017:1, count: {$size: "$_2016"} } },
{$unwind:"$_2016"},
{$unwind:"$_2017"},
{$match:{
$and:[
{$and:[ {'_2016._id': {$gte:801} },{'_2016._id': {$lte:1231}} ] },
{$and:[ {'_2017._id': {$gte:801} },{'_2017._id': {$lte:1231}} ] }
]
}
},
{$group: {
_id:'null',
tts16: {$sum: '$_2016.tts'},
tse16: {$sum: '$_2016.tse'},
tts17: {$sum: '$_2017.tts'},
tse17: {$sum: '$_2017.tse'},
count_2016_array: {$first: "$count"}
} },
{ $project : { tts17: { $divide : [ "$tts17", "$count_2016_array" ] }, tts16:1 }}
]).pretty()
答案 1 :(得分:-1)
您正在展开$_2016
和$_2017
,因此您可以获得9 *相同$_2017
字段的数量,因为{ {1}}
如果您只是运行聚合查询的这一部分,您将会看到我的意思
$_2016