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" }
解释:
- 在第一个项目阶段,我们仅从集合 col1 中筛选日期字段。
- 在第二阶段,我们添加来自 col2 集合的日期
- 在管道中,我们按降序对结果进行排序
- 最后一个流水线阶段的结果仅限于前 10 个
$unionWith
- 合并来自两个集合的文档
$sort
- 按 日期 对文档进行排序
$limit
- 到 return 只有前 10 个文档
db.collection_1.aggregate([
{
"$unionWith": {
"coll": "collection_2"
}
},
{
"$sort": {
"date": -1
}
},
{
"$limit": 10
}
])
抱歉,如果这个问题已经被问到,但我真的找不到解决我的特定问题的方法。
假设我有多个 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" }
解释:
- 在第一个项目阶段,我们仅从集合 col1 中筛选日期字段。
- 在第二阶段,我们添加来自 col2 集合的日期
- 在管道中,我们按降序对结果进行排序
- 最后一个流水线阶段的结果仅限于前 10 个
$unionWith
- 合并来自两个集合的文档$sort
- 按 日期 对文档进行排序
$limit
- 到 return 只有前 10 个文档
db.collection_1.aggregate([
{
"$unionWith": {
"coll": "collection_2"
}
},
{
"$sort": {
"date": -1
}
},
{
"$limit": 10
}
])