我在最新版本的MongoDB和pymongo中运行了以下聚合管道:

[
  {
    "$project": {
      "union": {
        "$setUnion": [
          "$query_a",
          "$query_b"
        ]
      }
    }
  },
  {
    "$unwind": "$union"
  },
  {
    "$group": {
      "_id": "$union.ID",
      "date_a": {
        "$addToSet": "$union.date_a"
      },
      "date_b": {
        "$addToSet": "$union.date_b"
      }
    }
  },
  {
    "$unwind": "$date_a"
  },
  {
    "$unwind": "$date_b"
  },
  {
    "$project": {
      "_id": 1,
      "date_a": "$date_a",
      "date_b": "date_b",
      "diff": {
        "$subtract": [
          {
            "$toInt": "$date_b"
          },
          {
            "$toInt": "$date_a"
          }
        ]
      }
    }
  },
  {
    "$match": {
      "diff": {
        "$gt": 0,
        "$lte": 20
      }
    }
  },
  
]

这给出了两条管线Query_a和Query_b的并集.在此并集之后,我希望获得ID上的与管线Query_c的交集:(Query_A Union Query_B)交集Query_c.

对于这playground example,所需的输出将是:

    [
      {
        "ID": "c80ea2cb-3272-77ae-8f46-d95de600c5bf",
        
      },
      {
        "ID": "cdbcc129-548a-9d51-895a-1538200664e6",
      }
    ]

推荐答案

您可以稍微更改和增强您的管道,以获得所需的输出.

db.collection.aggregate([
  {
    "$project": {
      "union": {
        // do the intersection here
        "$filter": {
          "input": {
            "$setUnion": [
              "$query_a",
              "$query_b"
            ]
          },
          "as": "elem",
          "cond": {
            // only take IDs in query_c
            "$in": ["$$elem.ID", "$query_c.ID"]
          }
        }
      }
    }
  },
  {
    "$unwind": "$union"
  },
  {
    "$group": {
      "_id": "$union.ID",
      "date_a": {
        "$addToSet": "$union.date_a"
      },
      "date_b": {
        "$addToSet": "$union.date_b"
      }
    }
  },
  {
    "$unwind": "$date_a"
  },
  {
    "$unwind": "$date_b"
  },
  {
    "$project": {
      "diff": {
        "$subtract": [
          {
            "$toInt": "$date_b"
          },
          {
            "$toInt": "$date_a"
          }
        ]
      }
    }
  },
  {
    "$match": {
      "diff": {
        "$gt": 0,
        "$lte": 20
      }
    }
  },
  { // get unique _id's
    "$group": {
      "_id": "$_id"
    }
  },
  { // rename _id to ID
    "$project": {
      "_id": 0,
      "ID": "$_id"
    }
  }
])

试穿一下mongoplayground.net号.

Mongodb相关问答推荐

如何限制/筛选子文档中的条目?

会话的Mongo-go驱动程序版本.Copy()

MongoDB-如何过滤和获取数组字段中的最新数据

在不知道字段名称的情况下如何引用 MongoDB 中的字段?

MongoDB 聚合 groupBy 日期并计算子文档

从 kubectl exec 获取返回值到 powershell 脚本

使用MongoDB作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

解析命令行时出错:unrecognized option --rest

MongoDB 是否重用已删除的空间?

.NET 中的 Mongodb 单元测试

如何使用 java 驱动程序更新 mongo db 中的文档字段?

mongodb-nodejs-driver,DeprecationWarning:collection.count 已弃用

如何在 Mongoose 中更新数组值

MongoDB - 我如何找到另一个集合中的文档未引用的所有文档

Ruby 按键值分组哈希

mongo - Ruby连接问题

用于嵌入式集合的 MongoDB 首选模式.文档与数组

有人在 Google App Engine 上try 过 MongoDB 吗?

通过浏览器连接mongodb?

有没有办法执行更新操作的dry run?