【问题标题】:MongoDB single query for different collections针对不同集合的 MongoDB 单一查询
【发布时间】:2022-01-22 19:28:44
【问题描述】:

对不起,如果问题已经被问过,但我真的找不到解决我的特定问题的方法。

假设我有多个集合:

// 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',
    }
}

如您所见,这两个集合的数据非常相似。是否可以将集合分开,但在查询时将它们全部返回?

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

如果不可能,我是否应该只制作一个集合并将两种文档都放在那里?使用猫鼬并具有预定义架构时是否可以这样做?

【问题讨论】:

    标签: mongodb mongoose mongodb-query nosql aggregation-framework


    【解决方案1】:

    $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

    【讨论】:

      【解决方案2】:
      • $unionWith - 合并两个集合中的文档
      • $sort - 按日期对文档进行排序
      • $limit - 只返回前 10 个文档
      db.collection_1.aggregate([
        {
          "$unionWith": {
            "coll": "collection_2"
          }
        },
        {
          "$sort": {
            "date": -1
          }
        },
        {
          "$limit": 10
        }
      ])
      

      Working example

      【讨论】:

      • 你同样应该得到接受的答案,但我把它给了@R2D2,因为他的名声更少,需要更多:D
      猜你喜欢
      • 2020-08-18
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2011-09-24
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多