【问题标题】:How to combine where clause and join? [duplicate]如何结合where子句和join? [复制]
【发布时间】:2017-01-17 13:49:27
【问题描述】:

如果我用 SQL 写这个,它会是(有点):

SELECT *
FROM request req, response res
WHERE req.suites_test=res.key    # join
  AND res.version='2.0.b1662.5'  # extra conditions
  AND req.suites_id='58762c40664df86d2069e2c9'

在 MongoDB 中我可以做到:

# a join between request and response 
db.response.aggregate([{$lookup: {from: "request", localField: "key", foreignField: "suites.test", as: "matching"} } ])

# find all requests that match a condition
db.request.find( { "suites.id": ObjectId("58762c40664df86d2069e2c9") } )

# find all responses that match a condition
db.response.find( { "version": "2.0.b1662.5" } )

如何在一个 MongoDB 查询中组合这三者?

【问题讨论】:

  • 第 1 步:开始编写现代的、显式的 JOIN 语法!
  • 我是 MongoDB 新手,不知道现代显式 JOIN 语法是什么……在文档 docs.mongodb.com/manual/reference/operator/aggregation/lookup 中并没有说它已被弃用。
  • Aggregate 实际上是一个管道,在那里匹配你的文档。
  • 对不起,我的意思是 SQL JOIN!
  • 根据您的个人查询,您只需要在response$lookup 之前)和request $unwind 之后,$lookup 之后)包含$match 阶段) 聚合管道中的集合。

标签: sql mongodb mongodb-query aggregation-framework


【解决方案1】:

有一堆相似的重复项,但我找不到完全匹配的重复项。所以,我根据 OP 的要求添加了一个答案。

根据您的个人查询,您只需在聚合管道中包含响应($lookup 之前)和请求($unwind 之后,$lookup 之后)集合的 $match 阶段。如下所示。

db.response.aggregate([{
    $match: {
        "version": "2.0.b1662.5"
    }
}, {
    $lookup: {
        from: "request",
        localField: "key",
        foreignField: "suites.test",
        as: "matching"
    }
}, {
    $unwind: "$matching"
}, {
    $match: {
        "matching.id": ObjectId("58762c40664df86d2069e2c9")
    }
}])

【讨论】:

  • 因为找不到精确的重复我们称之为可能的重复
  • 最后,您只是用这些可能的重复项污染了 SO,难怪我发现问题被标记为可能与我最初寻找的问题无关的其他问题的重复项,从而污染 SO 与乒乓可能重复。
  • 明白,但我觉得可能的重复并不接近 OP 的问题,而是纯粹的个人观点。
  • 现在任何人都在寻找一种简单的方法来混合 join 和 where 子句将在这个 Q/A 中找到它,而不是绝望地在 SO 中弹跳。
猜你喜欢
  • 2021-09-29
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2019-03-08
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多