有没有可能在MongoDB中做SQL内部连接之类的事情?
我知道聚合管道中有$lookup
属性,它相当于SQL中的外部联接,但我想做一些类似于内部联接的操作。
我有三个集合需要合并在一起:
// User Collection
db.User.find({});
// Output:
{
ID : 1,
USER_NAME : "John",
password : "pass"
}
{
ID : 2,
USER_NAME : "Andrew",
PASSWORD : "andrew"
}
// Role Collection
db.ROLE.find({});
// Output:
{
ID : 1,
ROLE_NAME : "admin"
},
{
ID : 2,
ROLE_NAME : "staff"
}
// USER_ROLE Collection
db.USER_ROLE.find({});
// Output:
{
ID : 1,
USER_ID : 1,
ROLE_ID : 1
}
我有上面的集合,我只想提取与用户及其角色匹配的文档,而不是所有的文档,在MongoDB中如何管理?
7条答案
按热度按时间yebdmbv41#
我自己找到了答案
$unwind为我提供了以下查询
总之谢谢你的回答
fbcarpbf2#
正如Tiramisu所写,这看起来像是架构问题。
您可以通过删除$lookup返回空数组的文档来进行手动内部连接。
结构描述变更
我个人将进行模式更新,如下所示:
laawzig23#
这会有帮助吗
在userschema上使用populate还可以减少冗余
cyvaqqii4#
您是对的,
$lookup
属性相当于SQL中的外连接,但是在mongoDB中,您需要额外的聚合阶段,以便在mongo中执行类似的INNER JOIN
。"希望能有所帮助"
iqxoj9l95#
MongoDB**$lookup聚合是解决这个问题的最正式和最优化的方法。但是,如果您使用Node.js**作为服务器端,那么您可以使用下面的小技巧。
我使用了MongoDB的Array
Push()
方法和$or
运算符。您可以使用$nor
运算符代替$or
来查找外部连接文档。您还可以使用$ne
、$nor
、$or
、$and
等来更改查找算法。bbmckpt76#
$查找聚合
对同一数据库中的集合执行左外部联接,以筛选“联接”集合中的文档进行处理。$lookup阶段向每个输入文档添加一个新的数组字段。新的数组字段包含“联接”集合中的匹配文档。$lookup阶段将这些经过整形的文档传递到下一阶段。
从MongoDB 5.1开始,$lookup可以跨分片集合工作。
若要组合两个不同集合中的元素,请使用$unionWith管道阶段。
语法
$lookup阶段具有以下语法:
具有单一连接条件的相等匹配
要在输入文档中的字段与“联接”集合的文档中的字段之间执行相等匹配,$lookup阶段的语法如下:
更多详情:https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/
de90aj5v7#