SQL查询的等效MongoDB查询

时间:2018-11-15 10:05:07

标签: mongodb

我是MongoDB中的新手。我想对此SQL查询进行等效的mongoDB查询

SELECT * FROM posts WHERE user_id IN
(SELECT follower_id FROM followers WHERE user_id = '@userid')
ORDERBY timestamp

此sql查询列表按时间戳顺序列出了来自关注的用户的所有帖子。

如果用户和帖子有两个集合,那么我该如何在mongoDB中编写等效查询 请帮我解决一下这个。预先感谢。

1 个答案:

答案 0 :(得分:0)

SELECT * FROM 帖子 WHERE user_id IN (SELECT follower_id FROM follower WHERE user_id = '@userid') ORDERBY 时间戳

上面的 SQL 转换为下面的 MongoDB 聚合查询:

db.posts.aggregate([{$lookup: {
  from: 'followers',
  localField: 'user_id',
  foreignField: 'user_id',
  as: 'userFollowes' 
}}, {$unwind: {
  path: '$userFollowes',
  preserveNullAndEmptyArrays: false 
}}, {$match: {
  "userFollowes.user_id": "user1" 
}}, {$sort: {
  timestamp: -1
}}, {$project: {
userFollowes:0

  }}])

它的优化版本将使用带条件的查找,以确保我们只对感兴趣的数据进行查找(连接)。

聚合具有以下阶段:

  1. 查找(加入或内部查询以根据 user_id 将数据与关注者匹配)
  2. 展开(如果根据 user_id 在关注者中找到多条记录,则将每条记录分开)
  3. 匹配(是否过滤 user_id = '@userid')
  4. 排序(按时间戳排序)
  5. 项目(确实从帖子中选择 *)

enter image description here

每日提示!:您可以使用以下代码并复制粘贴到聚合选项卡中(在“从纯文本新建管道”选项中 + 图标旁边的向下箭头),以便在指南针中收集帖子,以在调试模式下查看查询输出!

[{$lookup: {
  from: 'followers',
  localField: 'user_id',
  foreignField: 'user_id',
  as: 'userFollowes' 
}}, {$unwind: {
  path: '$userFollowes',
  preserveNullAndEmptyArrays: false 
}}, {$match: {
  "userFollowes.user_id": "user1" 
}}, {$sort: {
  timestamp: -1
}}, {$project: {
userFollowes:0

  }}]