我怎么能用mongodb写这个查询?

时间:2016-12-07 14:41:01

标签: sql mongodb

我想用mongodb

写这个查询
select   * 
from     tab1 a, tab2 c 
where    a.a_id = 2 
and      c.c_id = 3 
and      a.a_id = c.c_fk_account_id_created_by

我尝试了这段代码,但没有得到回复:

$cursor = $collection->find(array('$and' => array(array("a_id" => 2), array("c_id" => 3))));

3 个答案:

答案 0 :(得分:1)

我假设您有两个集合,名称为tab1和tab2,格式为

TAB1

   { 
        "_id" : ObjectId("58482a97a5fa273657ace535"), 
        "a_id" : NumberInt(2)
    }

TAB2

{ 
    "_id" : ObjectId("58482acca5fa273657ace539"), 
    "c_id" : NumberInt(3), 
    "c_fk_account_id_created_by" : NumberInt(2)
}

您将需要一个包含两个步骤的聚合查询,首先是$ lookup到第二个表,第二个$匹配正确的键。像这样。

db.tab1.aggregate(
[
    {
        $lookup: {
            "from" : "tab2",
            "localField" : "a_id",
            "foreignField" : "c_fk_account_id_created_by",
            "as" : "c"
        }
    },
    {
        $match: {
            "a_id": 2,
            "c.c_id": 3             
        }
    },
]

);

这将为您提供这样的输出

{ 
"_id" : ObjectId("58482a97a5fa273657ace535"), 
"a_id" : NumberInt(2), 
"c" : [
    {
        "_id" : ObjectId("58482acca5fa273657ace539"), 
        "c_id" : NumberInt(3), 
        "c_fk_account_id_created_by" : NumberInt(2)
    }
]

}

祝你好运!

答案 1 :(得分:1)

我写了一篇关于这种查询的文章:

用于T-SQL专业人员的MongoDB聚合框架#3:$ lookup运算符 https://www.linkedin.com/pulse/mongodb-aggregation-framework-t-sql-pros-3-lookup-operator-finch

基本上,您将使用$ lookup聚合运算符将第二个表中的所有文档放入第一个表的结果中。然后,您可以使用$ match和$ group运算符来过滤和汇总数据。

它会是这样的:

db.tab1.aggregate([
{   $match:
      {  "tab1.a_id": 2 }
},
{   $lookup:
     {  from: "tab2",
        localField: "a_id",
        foreignField: "c_fk_account_id",
        as: "tab2_results"
     }
},
{   $match:
      {  "tab2_results.c_id": 3 }
}
]}

匹配的连接文档将作为数组添加到基表的文档中。它充当LEFT连接,忽略远程表中的空值,并且仍返回基表文档,只丢失远程数据。

希望这有帮助!

比尔

答案 2 :(得分:0)

我们假设tab1和tab2各有3个字段,分别为a_idaa1aa2c_idc_fk_account_id_created_bycc1

查询如下

db.tab1.aggregate([{$match:{a_id:2}},{$lookup:{from:'tab2', localField:'c_fk_account_id_created_by', foreignField:'a_id', as:'ccArray'}},{$unwind:'$ccArray'}, {$project:{a_id:1,aa1:1, aa2:1, c_id:'$ccArray.c_id',c_fk_account_id_created_by:'$ccArray.c_fk_account_id_created_by',cc1:'$ccArray.cc1'}},{$match:{c_id:3}}])

以上查询的说明: 由于MongoDB不允许从聚合管道中的第二个表进行匹配,因此我们必须展开第二个表数组并比较值

select * from tab1 a, tab2 c where a.a_id = 2 ==> {$match:{a_id:2}} and c.c_id = 3 ==> (Cannot be done at first so it can be acheived as ) ==> {$unwind:'$ccArray'}, {$project:{a_id:1,aa1:1, aa2:1, c_id:'$ccArray.c_id',c_fk_account_id_created_by:'$ccArray.c_fk_account_id_created_by',cc1:'$ccArray.cc1'}},{$match:{c_id:3}} and a.a_id = c.c_fk_account_id_created_by ==> {$lookup:{from:'tab2', localField:'c_fk_account_id_created_by', foreignField:'a_id', as:'ccArray'}}