我想用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))));
答案 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_id
,aa1
,aa2
和c_id
,c_fk_account_id_created_by
,cc1
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'}}