mongodb将结果作为2列

时间:2016-12-09 09:45:53

标签: mongodb mongodb-query aggregation-framework

{
    "_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提供了错误的值

2 个答案:

答案 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