MongoDB 不同 collections 的单个查询

MongoDB single query for different collections

抱歉,如果这个问题已经被问到,但我真的找不到解决我的特定问题的方法。

假设我有多个 collections:

// collection 1 looks like this:
{
    fieldX: 'x',
    fieldY: 'y',
    date: '2022-01-15 12:00',
    condition: {
        enabled: true,
        condition: 'abc',
    }
}

// while collection 2 looks like this:
{
    fieldZ: 'z',
    date: '2022-01-15 15:25',
    condition: {
        enabled: false,
        condition: 'bce',
    }
}

如您所见,两个 collection 的数据非常相似。是否可以将 collection 分开,但在查询时将它们 return 放在一起?

例如,是否可以按日期对 collection 的文档进行排序,并在单个查询中获取前 10 个?

如果不行,我做一个collection,把两种文件都放进去好吗?使用 mongoose 并具有预定义架构时是否可以执行此操作?

$unionWith 操作从 mongodb 4.4 开始可用,它类似于 SQL 的 UNION ALL,示例:

mongos> db.col1.aggregate(
[{
    $project: {
      date: 1,
      _id: 0
    }
  },
  {
    $unionWith: {
      coll: "col2",
      pipeline: [{
        $project: {
          date: 1,
          _id: 0
        }
      }]
    }
  },
  {
    $sort: {
      date: -1
    }
  },
  {
    $limit: 10
  }
]
)

mongos> 

{ "date" : "2022-01-15 15:25" }
{ "date" : "2022-01-15 12:00" }

解释:

  1. 在第一个项目阶段,我们仅从集合 col1 中筛选日期字段。
  2. 在第二阶段,我们添加来自 col2 集合的日期
  3. 在管道中,我们按降序对结果进行排序
  4. 最后一个流水线阶段的结果仅限于前 10 个

playground example

  • $unionWith - 合并来自两个集合的文档
  • $sort - 按 日期
  • 对文档进行排序
  • $limit - 到 return 只有前 10 个文档
db.collection_1.aggregate([
  {
    "$unionWith": {
      "coll": "collection_2"
    }
  },
  {
    "$sort": {
      "date": -1
    }
  },
  {
    "$limit": 10
  }
])

Working example