javascript - Mongo 同时从 2 个集合中获得价值
问题描述
我正在尝试从 2 个集合中获取数据,并返回一个包含两个集合的合并数据的数组。
对我来说最好的解决方案是:
const bothValues = await ValueA.aggregate([
{ $unionWith: { coll: 'valueB' } },
{ $sort: { rank: -1, _id: -1 } },
{
$match: {
isAvailable: true,
},
},
{ $skip: skip },
{ $limit: 30 },
]);
完美的工作。但是..$unionWith
没有实现我的 MongoDB 版本(4.0.X)所以我不能使用它。
const bothValues = await ValueA.aggregate(
[
{ $limit: 1 },
{
$lookup: {
from: 'valueB',
pipeline: [{ $limit: 15 }],
as: 'valueB',
},
},
{
$lookup: {
from: 'ValueA',
pipeline: [{ $limit: 15 }, { $sort: { rank: -1, _id: -1 } }],
as: 'ValueA',
},
},
{
$project:
{
Union: { $concatArrays: ['$valueB', '$ValueA'] },
},
},
{ $unwind: '$Union' },
{ $replaceRoot: { newRoot: '$Union' } },
],
);
但现在,我遇到了两个问题:
- 我不能使用 a
$skip
,这很重要,在哪里使用它? - 如何使用 $match ?
谢谢
解决方案
询问
- 您的查询进行了一些更改,以像第一个查询一样工作
- 在两个管道中匹配,在两个管道中排序,(limit limitN+skipN)(这样我们可以确保我们总是有足够的文档,即使所有文档都来自 valueA 或 valueB)
- 从每个中取出已排序的 70,因此无论如何我们将在联合之后的最终排序/跳过/限制中获得所需的 70。
- concat,unwind,replace-root 就像您的查询一样
- 再次排序(现在对联合进行排序),跳过,限制
- 不管我们总是有足够的文件可以跳过
- 这个示例查询是针对的
skip=40
,limit=30
所以在前 2 个管道中,我们limit=70
db.ValueA.aggregate([
{
"$limit": 1
},
{
"$lookup": {
"from": "valueB",
"pipeline": [
{
"$match": {
"isAvailable": true
}
},
{
"$sort": {
"rank": -1,
"_id": -1
}
},
{
"$limit": 70
}
],
"as": "valueB"
}
},
{
"$lookup": {
"from": "valueA",
"pipeline": [
{
"$match": {
"isAvailable": true
}
},
{
"$sort": {
"rank": -1,
"_id": -1
}
},
{
"$limit": 70
}
],
"as": "valueA"
}
},
{
"$project": {
"union": {
"$concatArrays": [
"$valueA",
"$valueB"
]
}
}
},
{
"$unwind": {
"path": "$union"
}
},
{
"$replaceRoot": {
"newRoot": "$union"
}
},
{
"$sort": {
"rank": -1,
"_id": -1
}
},
{
"$skip": 40
},
{
"$limit": 30
}
])
推荐阅读
- javascript - 为什么来自 php 的数组内容没有输入到 js 中的数组?
- javascript - 上传文件时,我在哪里放置 Spinner 代码?
- javascript - 创建一个可以为每个实例动态生成唯一键/值对的类?(JS)
- reactjs - React Router Link 的自定义 svg 图像“按钮”
- python - Sphinx 无法导入某些模块
- python - 生成 n 叉树时的无限递归
- kotlin - 遍历一个集合并只打印一条消息,而不是为集合中的每个项目打印一条消息
- flutter - 我有一个要在多条路线中使用的小部件。我需要这个小部件来使用不同的自定义类实例,具体取决于它是哪个路由
- python - 如何在 Plotly 中将一个月内的所有数据组合成一个代表一个月的列?
- javascript - npm 错误!enoent ENOENT:没有这样的文件或目录,renD:\E-commerceJs\frontend\node_modules\.axios.DELETE'