将 SQL 查询转换为 Mongo 聚合

Posted

技术标签:

【中文标题】将 SQL 查询转换为 Mongo 聚合【英文标题】:Converting SQL Query to Mongo Aggregation 【发布时间】:2019-02-07 12:45:02 【问题描述】:

我对 mongodb 非常陌生,因此我广泛使用 SQL,我想尝试对 mongo 做同样的事情,就像我对 SQL 查询所做的那样。

我有 2 个收藏:

航班 属性: ID(字符串) 已验证(字符串) 有效(字符串)

使命 属性: ID(字符串) 航班(航班数组)

我需要根据如下所示的 SQL 查询检索数据(理论上):

SELECT VERIFIED, VALID 
FROM FLIGHT
WHERE FLIGHT.ID IN
 ( SELECT FLIGHTS
FROM MISSION
WHERE MISSION.ID = "somestring"
AND
FLIGHT.ID = MISSION.FLIGHTS)

集合中的文档示例:

航班


  "_id": ObjectId("5c4ae5b6a2ac3bc9f2e1b943"),
  "verified": "true",
  "valid": "true"

使命


  "_id": ObjectId("5c5acdd8bbf999dc34d96de7"),
  "flights":[
      ObjectId("5c4ae5b6a2ac3bc9f2e1b943"),
      ObjectId("5c4ae5eea2ac3bc9f2e1b961")
      ]
 

我很困惑如何使用“$lookup”和“$unwind”。

简单来说,我的聚合目的是:

我需要检索 ID 为“somestring”的 MISSION 中存在的所有 FLIGHTS 的 VALID 和 VERIFIED

【问题讨论】:

你能展示这两个集合的样本数据吗 【参考方案1】:

你可以在下面使用Aggregation

db.mission.aggregate([
      
        $match:  "_id": "Here is mission Object Id" 
      ,
      
        $lookup: 
          from: "flight",
          let:  flightIds: "$flights" ,
          pipeline: [
           
              $match: 
                $expr:  $in: [ "$_id", "$$flightIds" ]
              
            
          ],
          as: "result"
        
      
    ])

你可以试试Here

【讨论】:

您好,谢谢您的回答。但我似乎收到了这个错误pymongo.errors.OperationFailure: arguments to $lookup must be strings, let: flightIds: "$flights" is type object。为什么会发生这种情况? 请将您的 mongoDB 版本 3.4 更新到 3.6 或更高版本。谢谢。

以上是关于将 SQL 查询转换为 Mongo 聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongo 聚合将字符串转换为日期?

使用ROW_NUMBER()将复杂的DB2 SQL转换为mongo查询

将 spark 数据帧聚合转换为 SQL 查询; window、groupby 的问题,以及如何聚合?

markdown Mongo DB Query将字符串转换为日期,然后按日期聚合。

如何在mongo聚合不起作用的情况下将字符串转换为日期总是返回null?

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询