2013-02-17 117 views
1

我有这样的文件:无法获得总返回结果

{ 
    "_id" : ... 
    "args" : { 
    "pos" : [ <x>, <y> ], 
    ... 
    } 
} 

我想获得的最小和最大的< X>和< Y>使用下面的聚合值管道。它运行,但我没有得到任何价值。

db.main.aggregate([ 
    { '$match': { 
     "args.pos": { '$exists': true} } 
    }, 
    { '$project': 
     { 
      'x': "$args.pos.0", 
      'y': "$args.pos.1" 
     } 
    }, 
    { '$group': 
     { 
      '_id': 'pos', 
      'xmin': { '$min': '$x' }, 
      'xmax': { '$max': '$x' }, 
      'ymin': { '$min': '$y' }, 
      'ymax': { '$max': '$y' }, 
      'hits': { '$sum': 1 } 
     } 
    }, 
    { '$project': { 
     'hits': '$hits', 
     'xmin': '$xmin', 
     'xmax': '$xmax', 
     'ymin': '$ymin', 
     'ymax': '$ymax', 
     '_id': 0 } 
    } 
]) 

而且我得到以下输出:

{ 
     "result" : [ 
       { 
         "xmin" : [ ], 
         "xmax" : [ ], 
         "ymin" : [ ], 
         "ymax" : [ ], 
         "hits" : 281 
       } 
     ], 
     "ok" : 1 
} 

我已经尝试了各种不同的方式来存取权限的< X>和< Y>值,但我在这是新,显然我我错过了什么。任何帮助,将不胜感激。

我认为问题是我无法进入数组。我已经尝试了以下简单的查询与没有成功之一:

db.main.findOne({'function':'map'},{"arguments.pos":1}) 
{ 
     "_id" : ObjectId("5110407a2c8bea0f0d0000ce"), 
     "arguments" : { 
       "pos" : [ 
         -87.90774999999735, 
         42.11036897863933 
       ] 
     } 
} 

db.main.findOne({'function':'map'},{"arguments.pos.0":1}) 
{ 
     "_id" : ObjectId("5110407a2c8bea0f0d0000ce"), 
     "arguments" : { 
       "pos" : [ ] 
     } 
} 

db.main.findOne({'function':'map'},{"arguments.pos[0]":1}) 
{ "_id" : ObjectId("5110407a2c8bea0f0d0000ce"), "arguments" : { } } 

我从MongoDB的2.2运行蒙戈外壳,如果该事项。

回答

1

在投影中不能使用pos.0语法。在find中,您可以使用$slice运算符,但这是not yet allowed中的$project

但是,您可以以另一种方式做到这一点;使用$unwind和另一$group提取xy值:

db.main.aggregate([ 
    {$match: {'args.pos': {$exists: true}}}, 
    {$unwind: '$args.pos'}, 
    {$group: { 
     _id: '$_id', 
     x: {$first: '$args.pos'}, 
     y: {$last: '$args.pos'} 
    }}, 
    {$group: { 
     _id: null, 
     xmin: {$min: '$x'}, 
     xmax: {$max: '$x'}, 
     ymin: {$min: '$y'}, 
     ymax: {$max: '$y'}, 
     hits: {$sum: 1} 
    }}, 
    {$project: {_id: 0, xmin: 1, xmax: 1, ymin: 1, ymax: 1, hits: 1}} 
]) 
+1

太谢谢你了。我花了数小时寻找一种方法来做到这一点。每天学习新东西:) – 2013-02-18 03:45:46