此 SQL 查询的 MongoDB 等效项

Posted

技术标签:

【中文标题】此 SQL 查询的 MongoDB 等效项【英文标题】:MongoDB equivalent of this SQL query 【发布时间】:2018-03-26 14:34:40 【问题描述】:

我想知道如何在 MongoDB 中运行等效的以下 SQL 查询。

// 1 = current user ID

SELECT p.id, p.firstName, p.lastName from friendships f
JOIN person p ON p.id = f.requester
WHERE f.requestee = 1
UNION
SELECT p.id, p.firstName, p.lastName
from friendships f
JOIN person p ON p.id = f.requestee
WHERE f.requester = 1

友谊表

╔══════════════════════════════════════╗
║ requester       requestee       type ║
╠══════════════════════════════════════╣
║ userA           userC            1   ║
║ userB           userA            1   ║
║ userC           userD            1   ║
╚══════════════════════════════════════╝

假设我是userA我的朋友是根据上面的表格userBuserC,所以我需要这两个用户返回。

MongoDB 友情文档(收藏友情)


    requester: userID
    requestee: otherUserID
    type: // type of relationship (accepted, declined, blocked, etc.)
    time: // timestamp

MongoDB用户文档(集合用户)


    _id: ObjectId('random')
    firstName: 'Someone',
    lastName: 'Random'

期望的结果:当前用户的所有朋友及其用户详细信息。

[
    
        firstName: 'John'
        lastName: 'Doe'
        time: // timestamp from friendship document
    ,
    
        firstName: 'Jane'
        lastName: 'Doe'
        time: // timestamp from friendship document
    ,
    
        firstName: 'James'
        lastName: 'Doe'
        time: // timestamp from friendship document
    
]

非常感谢您提前提供的所有帮助。

【问题讨论】:

您的 mongoDB 架构是什么样的?有哪些收藏? 欢迎堆栈溢出。请花时间学习How to Ask。如果您需要帮助,您需要付出一些努力。谢谢。 第 1 步:简化当前 SQL 查询。无需 UNION... @YuvrajJaiswal 我刚刚更新了问题。 发布一些示例数据@Sebastian 【参考方案1】:

这是基于问题中可用信息的部分答案。您可能需要根据需要进行更改。任何改进表示赞赏。

db.friendship.aggregate([
 
      $lookup:  
         from:"person",
         as: "p1",
         localField: "personid1",
         foreignField: "personid",
      
    ,
     
      $lookup:  
         from:"person",
         as: "p2",
         localField: "personid2",
         foreignField: "personid",
      
    ,
    
        $match: $or: [personid1:"1",personid2:"1"]
    ,
    
        $replaceRoot: newRoot: 
            "persons" :  $setUnion : [ "$p1" , "$p2" ]
        
        
    ,
        $unwind:  path: "$persons"
    ,
    
        $group: _id: personid:"$persons.personid", firstname:"$persons.firstname", lastname:"$persons.lastname" 
    ,
    
        $replaceRoot: newRoot: 
            "personid" : "$_id.personid",
            "firstname" : "$_id.firstname",
            "lastname" : "$_id.lastname"
        
        
    
]).pretty()

【讨论】:

它就像一个魅力,但还有一件事,是否可以排除当前用户?它返回包括当前用户在内的好友数组。 张贴一些数据用于友情和人物收集 有问题。如问题所述,它返回“期望结果”,但此结果也包含当前用户。它返回包括您在内的所有朋友的数组。我只需要它来回报你的朋友。 老实说。您的 sql 和您发布的集合不匹配。我编写了类似于您的 sql 查询的 mongo 查询。我需要确切的信息来提供更多帮助。参考***.com/help/mcve personA 是您当前的用户 ID 吗?如果是这样,为什么你的 sql 查询要加入 person 的 2 个字段?

以上是关于此 SQL 查询的 MongoDB 等效项的主要内容,如果未能解决你的问题,请参考以下文章

此 SQL 的 Cosmos DB 等效项

没有嵌套查询的 Excel 的近似 VLOOKUP(第一个相关值)的 SQL 等效项

重复字符串上的 SQL 等效“$all”MongoDB 运算符

Mongodb中的SUM()?查询问题?

SQL 和 Mongo 等效查询

SQL Server 中的 SUBSTRING_INDEX 等效项