2

をPHPにはマップと骨材とのMongoDBシェルクエリを変換します私はMongoDBのバージョン3.0でこのクエリをしなければならなかったので、次の関係データベースクエリは私がPHPコードに変換するに苦労していますMongoDBのクエリを書い

Select ip,count(*) 
from audit 
where ip not in (select ip from geoip) 
group by ip 

の同等のは、私は$ Lの利点を活用することができませんでした答えに示唆されているようにookup。

以下のPHPコードは上記の目的を達成し、期待通りに動作します。ジオープコレクションからはっきりとした唇が得られます。その結果を渡し、監査コレクションに集計を行い、目的の結果を得ます。次のように

$geoipcolln = $this->dbConn->selectCollection('geoip');  
$geoips = $geoipcolln->distinct('ip');   
$match = array('ip' => array('$nin' => $geoips));   
$result = $this->collection->aggregate(     
       array(
         '$match' => $match 
        ), 
       array('$group' => array(
          '_id'  => '$ip',         
          'count'  => array('$sum' => 1.0),        
         ))  
      ); 

答えて

1

これは$lookup演算子を使用して1つの集計クエリで行うことができます:これは、ように見える

<?php 
    $m = new MongoClient("localhost"); 
    $c = $m->selectDB("yourDB")->selectCollection("audit"); 
    $ops = array(
     array(
      "$lookup" => array(
       "from" => "geoip", 
       "localField" => "ip", 
       "foreignField" => "ip", 
       "as" => "geoips" 
      ) 
     ), 
     array("$match" => array("geoips.0" => array("$exists" => false))), 
     array("$group" => array(
      "_id" => "$ip", 
      "count" => array("$sum" => 1) 
     ))  
    ); 
    $results = $c->aggregate($ops); 
    var_dump($results); 
?> 
+0

:その後としてPHPに変換することができ

var result = db.audit.aggregate([ { "$lookup": { "from": "geoip", "localField": "ip", "foreignField": "ip", "as": "geoips" } }, { "$match": { "geoips.0": { "$exists": false } } }, { "$group": { "_id": "$ip", "count": { "$sum": 1 } }} ]) 

パフォーマンスの観点から優れた代替手段です。しかし、私は現在、mongodb 3.0バージョンを実行しています。 $ lookupのように見える3.2バージョンが必要です。この時点で、私はアップグレードすることはできません。 – FoxShrill

関連する問題