如何在 MongoDB 中执行此 Sql 查询

Posted

技术标签:

【中文标题】如何在 MongoDB 中执行此 Sql 查询【英文标题】:How to do this Sql query in MongoDB 【发布时间】:2013-08-14 10:29:35 【问题描述】:

我有两个集合:用户和通知。 我需要获取所有管理员用户的通知列表

我来自 sql 上下文。所以在 mssql 中我能够做到:

SELECT notificationId, notificationText  FROM notifications 
WHERE username IN (select username from users where userrole = 'admin');

我在 mongodb 中尝试了以下操作:

db.notificaitons.find( username: $in:/*get list of admin users here*/ , 
notificationId: 1, notificationText: 1)

有没有办法在单个数据库查询中做到这一点?还是我应该在两个不同的查询中进行。 (我正在使用带有猫鼬的节点 js)

我无法真正理解逻辑。谢谢。

【问题讨论】:

它需要两个查询。一个用于管理员,第二个用于通知。如果可能和必要,缓存管理员列表。 为了能够将其作为单个查询进行,您需要将要查询的数据与通知一起存储,因此在这种情况下可能是用户角色和名称。然后您可以进行如下查询:db.notificaitons.find( userrole: "admin" , notificationId: 1, notificationText: 1) 很好的答案,但是... 答案应该以 answers 的形式发布,而不是 cmets。 【参考方案1】:

您需要两个查询,或修改您的架构。我建议您在通知集合中不仅存储username,还存储userrole


   username: "derickr",
   userroles: [ "admin", "newbie" ].
   notificationId: 42,
   notificationText: "This is awesome",

如您所见,我将 userroles 设为一个数组,具有多个用户角色 - 我规定这也是您所拥有的。现在可以通过以下方式轻松查询管理员用户的所有通知:

// create index
db.notifications.ensureIndex(  userroles: 1   );

// do query
db.notifications.find(  userroles: "admin"  );

【讨论】:

以上是关于如何在 MongoDB 中执行此 Sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将此类 sql 查询转换为 mongodb 查询

如何在查询生成器 laravel 中执行此 SQL

如何转换 MongoDB 查询并使用索引

如何在 MongoDB 中执行领先和滞后

如何在 mongodb 中运行此查询?

如何将此 sql 查询转换为 mongodb?