我正在将SQL查询重写为mongoDB。有人可以帮助我们如何像下面的SQL查询那样用多个连接键和条件连接两个集合吗?
SELECT S.* FROM LeftTable S
LEFT JOIN RightTable R ON S.ID =R.ID AND S.MID =R.MID WHERE R.TIM >0 AND S.MOB IS NOT NULL我有下面的代码,它与单连接关键字条件。如果有人能用多个连接键和where子句来完成查询,我会很高兴的。
db.dim.aggregate([{$lookup:{from:"dimFactsVer11",localField:"Sub", foreignField:"Type", as:"EmbedUp"}}])发布于 2016-10-24 17:53:44
目前mongodb $lookup只比较单个本地和外部密钥。
但是,如果你想像mysql left join那样使用两个或更多的文件来执行查询,那么下面就是解决方案。
db.getCollection('LeftTable').aggregate([
{
$lookup:
{
from: "RightTable",
localField: "ID",
foreignField: "ID",
as: "RightTableData"
}
},
{$unwind :"$RightTableData" },
{
$project: {
mid: { $cond: [ { $eq: [ '$MID', '$RightTableData.MID' ] }, 1, 0 ] }
}
},
{$match : { mid : 1}}
])这里的$MID是LeftTable中场。
发布于 2017-04-19 02:46:29
通过正确组合$lookup、$project和$match,您可以在参数上连接多个表。这是因为它们可以被链接多次。
第1步:链接所有表
$lookup -查询中的每个表一个
$unwind -因为数据被正确地反规范化,否则包装在数组中
Python代码..
db.LeftTable.aggregate([
# connect all tables
{"$lookup": {
"from": "RightTable",
"localField": "ID",
"foreignField": "ID",
"as": "R"
}},
{"$unwind": "R"}
# {"$lookup": {
# "from": "TopTable",
# "localField": "ID",
# "foreignField": "ID",
# "as": "T"
# }},
# {"$unwind": "T"},
])第2步:定义所有条件
$project:在这里定义所有条件语句,以及您想要选择的所有变量。
Python代码..
db.LeftTable.aggregate([
# connect all tables
{"$lookup": {
"from": "RightTable",
"localField": "ID",
"foreignField": "ID",
"as": "R"
}},
{"$unwind": "R"},
# {"$lookup": {
# "from": "TopTable",
# "localField": "ID",
# "foreignField": "ID",
# "as": "T"
# }},
# {"$unwind": "T"},
# define conditionals + variables
{"$project": {
"midEq": {"$eq": ["$MID", "$R.MID"]},
# "midGt": {"$gt": ["$MID", "$T.MID"]},
"ID": 1, "MOB": 1, "MID": 1
}}
])第3步:加入所有条件句
$match -使用OR或AND等连接所有条件。这些条件可以有多个。
$project:取消定义所有条件
Python代码..
db.LeftTable.aggregate([
# connect all tables
{"$lookup": {
"from": "RightTable",
"localField": "ID",
"foreignField": "ID",
"as": "R"
}},
{"$unwind": "$R"},
# {"$lookup": {
# "from": "TopTable",
# "localField": "ID",
# "foreignField": "ID",
# "as": "T"
#}},
#{"$unwind": "$T"},
# define conditionals + variables
{"$project": {
"midEq": {"$eq": ["$MID", "$R.MID"]},
# "midGt": {"$gt": ["$MID", "$T.MID"]},
"ID": 1, "MOB": 1, "MID": 1
}},
# join all conditionals
{"$match": {
"$and": [
{"R.TIM": {"$gt": 0}},
{"MOB": {"$exists": True}},
{"midEq": {"$eq": True}},]
}},
# undefine conditionals
{"$project": {
"midEq": 0,
# "midGt": 0
}}
])几乎任何表、条件和连接的组合都可以用这种方式完成。
https://stackoverflow.com/questions/38224981
复制相似问题