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 から mongo shell を実行しています。

4

1 に答える 1

1

pos.0プロジェクションで構文を使用することはできません。aでは代わりに演算子findを使用できますが、.ではまだ許可されていません。$slice$project

ただし、これは別の方法で行うことができます。$unwindand anotherを使用してandの値$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}}
])
于 2013-02-17T15:25:44.883 に答える