我在MongoDB(4.2,如果有关系的话)中有以下集合
[
{"a":1,"b":1,"c":1,"d":1},
{"a":2,"b":1,"c":1,"d":8},
{"a":3,"b":1,"c":0,"d":1},
{"a":4,"b":2,"c":1,"d":1},
{"a":5,"b":2,"c":0,"d":1},
{"a":6,"b":3,"c":0,"d":2},
{"a":7,"b":4,"c":1,"d":1},
{"a":8,"b":5,"c":0,"d":4},
{"a":9,"b":6,"c":1,"d":1}
]
我尝试检索满足条件c=1和d=1的每个记录,这些记录还满足以下条件。值B=1的其他记录不能具有值1的c。
结果集应为
[
{"a":4,"b":2,"c":1,"d":1},
{"a":7,"b":4,"c":1,"d":1},
{"a":9,"b":6,"c":1,"d":1}
]
我被难住了,特别是因为我想按如下方式处理这个问题。
(1).在原始集合中找到所有d=1和c=1的记录。
(2).在原始集合中找到B的值,其中存在多个c=1的记录。
(3).从% 1中删除在% 2中找到的包含B值的记录
在sql中,我将执行以下操作
SELECT t1.*
FROM
(SELECT* FROM tbl WHERE c=1 AND d=1) t1
LEFT JOIN
(SELECT b,SUM(CASE WHEN c=1 THEN 1 ELSE 0 END) as c_count
FROM tbl
GROUP BY b) t2
ON t1.b = t2.b
WHERE c_count = 1
或
SELECT *
FROM test
WHERE c = 1
AND d = 1
AND b IN (SELECT b
FROM (SELECT b,
Sum(CASE
WHEN c = 1 THEN 1
ELSE 0
END) AS c_count
FROM test
GROUP BY b)
WHERE c_count = 1)
这样的事情在mongodb中可能发生吗?我的主要困难似乎是能够让视图彼此交互
我看过$lookup,但似乎不能使用它执行以下类似SQL的操作,特别是因为“join”的“right table”是一个视图而不是集合。
我想我的问题是N倍的。我怎样才能得到我想要的结果?有可能通过模拟sql来实现吗?更重要的是,是否可以通过同一集合上的聚合管道的结果来联接或筛选值
1条答案
按热度按时间6l7fqoea1#
您可以使用两个查询来实现。第一个查询将是一个聚合管道,以获取所有有效的
b
值。像这样:这将给予以下输出:
这个数组可以Map到一个数字数组
[2, 6, 4]
。使用此数组,您可以执行以下操作:Playground link - 1Playground link - 2