此 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
我的朋友是根据上面的表格userB
和userC
,所以我需要这两个用户返回。
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 等效项的主要内容,如果未能解决你的问题,请参考以下文章
没有嵌套查询的 Excel 的近似 VLOOKUP(第一个相关值)的 SQL 等效项