我有以下文件:
{
"_id" : ...
"args" : {
"pos" : [ <x>, <y> ],
...
}
}
我想获得&lt; x&gt;的最小值和最大值和&lt; y&gt;使用以下聚合管道的值。它运行但我没有得到任何价值。
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
}
我尝试了各种不同的方法来访问&lt; x&gt;和&lt; y&gt;价值观,但我是新的,显然我错过了一些东西。任何帮助将不胜感激。
我认为问题是我无法进入阵列。我尝试了以下更简单的查询但没有成功:
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运行mongo shell。
答案 0 :(得分:1)
您无法在投影中使用pos.0
语法。在find
中,您可以使用$slice
运算符代替$project
中的not yet allowed。
然而,你可以用另一种方式做到这一点;使用$unwind
和另一个$group
来提取x
和y
值:
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}}
])