首页 新闻 搜索 专区 学院

mongodb关联查询

0
悬赏园豆:60 [已解决问题] 解决于 2019-11-05 17:23

mongodb两个表关联查询 找到username在user1中存在 user2中不存在数据,即lisi这条数据

求大神给点意见.

Sun浩的主页 Sun浩 | 初学一级 | 园豆:100
提问于:2019-11-05 14:16
< >
分享
最佳答案
0

难道$lookup满足不了??https://www.cnblogs.com/xuliuzai/p/10055535.html

收获园豆:60
Ctrl` | 老鸟四级 |园豆:3246 | 2019-11-05 14:22

$lookup 应该是相等. 我这个结果集类似于取反.
试过.不能只出lisi这一条数据

Sun浩 | 园豆:100 (初学一级) | 2019-11-05 14:27

@Sun浩: 如果是两张表的话,相当于要取user1.username != user2.username的数据。
mongo与关系库的差异:$match等同于where、$ne等同于<>或!=

Ctrl` | 园豆:3246 (老鸟四级) | 2019-11-05 14:36

@Ctrl`: 是这样的.可是不会写啊-.-. 一张表的$ne 还能整明白.两张就乱了

Sun浩 | 园豆:100 (初学一级) | 2019-11-05 14:39

@Sun浩: 尝试了一把...(没环境,搞得我还重新装了一把)

语句:
db.test_table.aggregate([
{
$lookup:
{
from: "test_table_1",
localField: "testColumn",
foreignField: "testColumn_1",
as: "test_table_join"
}
},
{ $unwind: "$test_table_join" },
{ $match : {"test_table_join.name" : "linux"} }])

解释:
test_table:第一张表;
test_table_1:第二张表;
localField/foreignField:值为随意起的名称(非数据库表字段);
{ $unwind: "$test_table_join" },表示把从test_table表中查询的数据字段,作为第二张表(test_table_1)中的字段;

test_table数据:
db.test_table.insertMany([
{id:1,name:'张三'},
{id:2,name:'李思'},
{id:3,name:'王五'}])

test_table_1数据:
db.test_table_1.insertMany([
{id:1,name:'张三'},
{id:2,name:'李思'},
{id:3,name:'王五'},
{id:4,name:'linux'},
{id:5,name:''},])

查询结果:

注意:
1:缺点:该方法需要指定value值。即你的'lisi'需要写死...(蛋疼、试了半天都无法破除这个问题);
且结果会将join的结果一起查询出来。。。
2:好处是:test_table_join中包含的是指定的需要数据(还是重复的、好恶心a...)。

不指望能直接处理你的问题,能提供点思路也行...
或者就直接join查询两张表的所有结果,在代码里用集合处理吧(如果没有更好思路的话...)

Ctrl` | 园豆:3246 (老鸟四级) | 2019-11-05 17:14

@Ctrl`: 感谢感谢.我研究一下.

Sun浩 | 园豆:100 (初学一级) | 2019-11-05 17:23

@Ctrl`: 这个写法是OK 的.
db.getCollection("user").aggregate(
[
{
"$project" : {
"_id" : NumberInt(0),
"u1" : "$$ROOT"
}
},
{
"$lookup" : {
"localField" : "u1.username",
"from" : "user2",
"foreignField" : "username",
"as" : "u2"
}
},
{
"$unwind" : {
"path" : "$u2",
"preserveNullAndEmptyArrays" : true
}
},
{
"$match" : {
"u2.username" : null
}
},
{
"$project" : {
"u1.username" : "$u1.username",
"_id" : NumberInt(0)
}
}
],
{
"allowDiskUse" : true
}
);

Sun浩 | 园豆:100 (初学一级) | 2019-11-11 15:33

@Sun浩: ok

Ctrl` | 园豆:3246 (老鸟四级) | 2019-11-11 15:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册