-1

次の構造の配列があります。

Array
(
    [526e379cdc178e5f8fb31e84] => Array
        (
            [_id] => MongoId Object
                (
                    [$id] => 526e379cdc178e5f8fb31e84
                )

            [lv] => Array
                (
                    [0] => Array
                        (
                            [ln] => Hospital bill review
                            [pa] => Auditing
                        )

                    [1] => Array
                        (
                            [ln] => Fraud
                            [pa] => -1
                        )

                    [2] => Array
                        (
                            [ln] => Type of detected/predicted fraud
                            [pa] => Fraud
                        )

                    [3] => Array
                        (
                            [ln] => Individual fraud
                            [pa] => Type of detected/predicted fraud
                        )

                )

            [pn] => AU2000240683A2
        )

    [526e379bdc178e5f8fb31e0d] => Array
        (
            [_id] => MongoId Object
                (
                    [$id] => 526e379bdc178e5f8fb31e0d
                )

            [lv] => Array
                (
                    [0] => Array
                        (
                            [ln] => Claim processing
                            [pa] => Methods for detecting/predicting fraud
                        )

                    [1] => Array
                        (
                            [ln] => Claim cost management(settlement)
                            [pa] => -1
                        )

                    [2] => Array
                        (
                            [ln] => Multiple payer options/ liability computation
                            [pa] => Claim cost management(settlement)
                        )

                )

            [pn] => AU2001239752B2
        )
)

次の集計関数を使用しています。

$out = $collection->aggregate(array(
        array('$unwind'=>'$lv'),
        array('$match' => array('lv.pa'=>-1)),
        array('$group'=>array(_id=>'$lv.ln')), 
        )
    ); 
    print_r($out);

次の結果が得られます。

Array
(
    [result] => Array
        (
            [0] => Array
                (
                    [_id] => Fraud
                )

            [1] => Array
                (
                    [_id] => Claim cost management(settlement)
                )

        )

    [ok] => 1
)

しかし、PHPを使わずに以下のような構造が欲しいです。私はすでにPHPを使用して実装しています。

Array
(
    [result] => Array
        (
            [0] =>  Fraud
            [1] =>  Claim cost management(settlement)
        )

    [ok] => 1
)

前もって感謝します。

4

2 に答える 2

2

MongoDB からの結果は、ドキュメントのシーケンス/配列です。BSON 配列は内部的には (サブ) ドキュメントに非常に似ていますが、フィールドの値にしかなれません。最上位の結果として BSON 配列を返すことはできません。

次の集計関数

$out = $collection->aggregate(array(
        array('$unwind'=>'$lv'),
        array('$match' => array('lv.pa'=>-1)),
        array('$group'=>array(_id=>'$lv.pa', ln=>array('$addToSet'=>'$lv.ln'))),
        array('$project'=>array(_id=>0, ln=>'$ln'))
        )
    );
    print_r($out);

次の結果が得られるはずです。

Array
(
    [result] => Array
        (
            [ln] => Array
                (
                    [0] =>  Fraud
                    [1] =>  Claim cost management(settlement)
                )
        )

    [ok] => 1
)

上記はテストしていませんが、次の JavaScript に相当するものをテストしました。

var docs = [
    {
        '_id': ObjectId("526e379cdc178e5f8fb31e84"),
        'lv': [
            {
                'ln': 'Hospital bill review',
                'pa': 'Auditing'
            },
            {
                'ln': 'Fraud',
                'pa': -1
            },
            {
                'ln': 'Type of detected / predicted fraud',
                'pa': 'Fraud'
            },
            {
                'ln': 'Individual fraud',
                'pa': 'Type of detected / predicted fraud'
            }
        ]
    },
    {
        '_id': ObjectId('526e379bdc178e5f8fb31e0d'),
        'lv': [
            {
                'ln': 'Claim processing',
                'pa': 'Methods for detecting / predicting fraud'
            },
            {
                'ln': 'Claim cost management(settlement)',
                'pa': -1
            },
            {
                'ln': 'Multiple payer options / liability computation',
                'pa': 'Claim cost management(settlement)'
            }
        ]
    }
];
db.test.remove();
db.test.save(docs);
var pipeline = [
    {$unwind: '$lv'},
    {$match: {'lv.pa': -1}},
    {$group: {_id: '$lv.pa', ln: {$addToSet: '$lv.ln'}}},
    {$project: {_id: 0, ln: '$ln'}}
];
printjson(db.test.aggregate(pipeline));

結果は次のとおりです。

{
    "result" : [
        {
            "ln" : [
                "Fraud",
                "Claim cost management(settlement)"
            ]
        }
    ],
    "ok" : 1
}
于 2013-10-29T17:45:23.943 に答える