mongodb两个表关联查询 找到username在user1中存在 user2中不存在数据,即lisi这条数据
求大神给点意见.
难道$lookup满足不了??https://www.cnblogs.com/xuliuzai/p/10055535.html
$lookup 应该是相等. 我这个结果集类似于取反.
试过.不能只出lisi这一条数据
@Sun浩: 如果是两张表的话,相当于要取user1.username != user2.username的数据。
mongo与关系库的差异:$match等同于where、$ne等同于<>或!=
@Ctrl`: 是这样的.可是不会写啊-.-. 一张表的$ne 还能整明白.两张就乱了
@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`: 感谢感谢.我研究一下.
@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浩: ok