在MongoDB中连接同一集合上的两个不同查询

wlwcrazw  于 2023-05-28  发布在  Go
关注(0)|答案(1)|浏览(172)

我在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来实现吗?更重要的是,是否可以通过同一集合上的聚合管道的结果来联接或筛选值

6l7fqoea

6l7fqoea1#

您可以使用两个查询来实现。第一个查询将是一个聚合管道,以获取所有有效的b值。像这样:

db.collection.aggregate([
  {
    "$group": {
      "_id": "$b",
      "count": {
        "$sum": {
          "$cond": {
            "if": {
              "$eq": [
                "$c",
                1
              ]
            },
            "then": 1,
            "else": 0
          }
        }
      }
    }
  },
  {
    "$match": {
      count: 1
    }
  },
  {
    "$project": {
      _id: 1
    }
  }
])

这将给予以下输出:

[
  {
    "_id": 2
  },
  {
    "_id": 6
  },
  {
    "_id": 4
  }
]

这个数组可以Map到一个数字数组[2, 6, 4]。使用此数组,您可以执行以下操作:

db.collection.find({c: 1, d: 1, b: { $in: [2,4,6] }})

Playground link - 1Playground link - 2

相关问题