将Mongodb shell查询与map和aggregate转换为php


Convert Mongodb shell query with map and aggregate to php

我写了一个mongodb查询,我很难转换为php代码:

var geoips = db.geoip.find().map(function(like){ return like.ip; });
var result = db.audit.aggregate([
    { $match: { ip: { $nin: geoips } } },
    { $group: {
        _id: "$ip",
        count: { $sum: 1 }
    }}
]);

更新:

上面的查询等价于下面的关系型数据库查询

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

由于我必须在mongodb 3.0版本中进行此查询,因此我无法利用答案中建议的$lookup。

下面的PHP代码实现了上述目标,并按预期工作。它从geoip集合中获取不同的ip。它传递该结果并对审计集合进行聚合以获得所需的结果。

$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),                            
                        ))    
            ); 

这可以在一个聚合查询中使用 $lookup 操作符完成,如下所示:

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 }
    }}
])

可以翻译成PHP:

<?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);
?>