【问题标题】:Mongo get value from 2 collections same timeMongo 同时从 2 个集合中获得价值
【发布时间】:2021-11-26 14:21:29
【问题描述】:

我正在尝试从 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' } },
      ],
    );

但现在,我遇到了 2 个问题:

  • 我不能使用$skip,这很重要,在哪里使用?
  • 如何使用 $match ?

谢谢

【问题讨论】:

    标签: javascript arrays mongodb mongoose union


    【解决方案1】:

    查询

    • 您的查询进行了一些更改,以便像第一个查询一样工作
    • 在两个管道中匹配,在两个管道中排序,(limit limitN+skipN) (这样我们可以确保我们始终有足够的文档,即使所有文档都来自 valueA 或 valueB)
    • 从每个中取出已排序的 70,因此无论如何我们都会在联合之后的最终排序/跳过/限制中获得所需的 70。
    • concat,unwind,replace-root 就像在您的查询中一样
    • 再次排序(现在对联合进行排序)、跳过、限制
    • 不管我们总是有足够的文档可以跳过
    • 这个示例查询是针对skip=40limit=30 进行的,所以在前两个管道中我们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
      }
    ])
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2017-05-07
      • 2011-04-05
      相关资源
      最近更新 更多