首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用map和聚合将Mongodb查询转换为php

使用map和聚合将Mongodb查询转换为php
EN

Stack Overflow用户
提问于 2016-10-28 06:50:31
回答 1查看 577关注 0票数 2

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

代码语言:javascript
复制
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 }
    }}
]);

更新:

以上查询相当于以下关系数据库查询

代码语言:javascript
复制
Select ip,count(*) 
from audit 
where ip not in (select ip from geoip)
group by ip

由于我必须在MongoDBVersion3.0中进行此查询,所以无法像回答中所建议的那样利用$lookup。

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

代码语言:javascript
复制
$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),                            
                        ))    
            ); 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-28 09:44:41

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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);
?>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40299593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档