【问题标题】:How to merge two queries into a single query in MongoDB如何在 MongoDB 中将两个查询合并为一个查询
【发布时间】:2021-09-28 21:51:10
【问题描述】:

这里我对一张表有两个查询。第二个查询的 $match 包含第一个查询的结果。

db.histories.aggregate([    
    {$match: {
        from: userid,
        connectTime: {"$gte":yesterday},
        status:'completed'
      }},
    {$group: {
        _id: '$groupId',
        groupId: { $last: '$groupId' },
        callId:{ $last: '$callId' },
      }},
    { $sort: {
        connectTime:-1
      } }
  ])

第一个查询的结果包含“callId”,使用那个“callId”我正在聚合第二个查询。

db.histories.aggregate([    
    {$match: {
        $or: [{ callId: {"$in": groupCallIdArray} }, { connectedCallId: {"$in": groupCallIdArray} }],
        status:'completed'
      }},
    {$group: {
        _id: {'groupId':'$groupId'},
        from: { $last: '$from' },
        to: { $last: '$to' },
        minimumTime: { $last: '$minimumTime' },
        noOfcalls: {$sum:1},
        duration:{ $sum: '$duration' },
      }}
  ])

我们有没有办法将两个查询合并为一个查询。

输入 JSON

[{
 "_id" : ObjectId("60fe4bf5c0fe3d0017059776"),
 "callId" : "CAbfadc16eed3f493f742b208e283848af",
 "connectedCallId" : "CA0c61d90d1694ef219b42412246570c63",
 "from" : ObjectId("6062f39c9ccebd00178bf302"),
 "to" : ObjectId("606d59547db42d00178234a6"),
 "callConnectTime" : 2021-07-26 05:44:19.573Z,
 "status" : "completed",
 "minimumTime" : 15,
 "duration" : 24,
 "groupId" : ObjectId("60c8908e55242c00170e3e00"),
}]

第一个查询输出

[
  {
    _id:60fe4bf5c0fe3d0017059776,
    gigsId: 60fe4bf5c0fe3d0017059776,
    callSid: 'CAbfadc16eed3f493f742b208e283848af'
  }
]

使用第一个查询输出我正在为第二个查询创建匹配查询。 groupCallIdArray = ["CAbfadc16eed3f493f742b208e283848af"]

第二个查询输入

[{
    _id:{groupId:ObjectId("60fe4bf5c0fe3d0017059776")},
    from:ObjectId("6062f39c9ccebd00178bf302"),
    to:ObjectId("606d59547db42d00178234a6"),
    minimumTime:15,
    noOfcalls:1,
    duration:24,
}...
]

【问题讨论】:

  • 是的,有多种方法可以合并到单个查询中。如果您包含数据示例以及查询应报告的内容示例(即显示预期的输入和输出),将会很有帮助。两者都应该是有效的 JSON 并使用在线解析工具进行解析。因为您使用 $last 进行分组,这意味着您有多个条件记录。您的示例数据应包含此条件。
  • @barrypicker 我已经包含了示例 json
  • 您的预期结果与第一个查询的输出不匹配。目前尚不清楚您希望这两个查询如何交互。
  • @barrypicker 我还添加了第一个查询输出。在第一个查询中,我试图从组中找到最后一个呼叫。第一个呼叫输出包含使用该 CallID 的 callID,我正在搜索第二个查询。我正在计算持续时间和 noOfCalls 等。

标签: node.js mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

您可以使用$lookup 拉入比赛。

类似

db.histories.aggregate([    
    {$match: {
        from: userid,
        connectTime: {"$gte":yesterday},
        status:'completed'
      }},
    { $sort: {
        connectTime:-1
      } }
    {$group: {
        _id: '$groupId',
        groupId: { $last: '$groupId' },
        callId:{ $last: '$callId' },
      }},
   {$group: {
       _id: null,
       groupCallIdArray: { $push: '$callId'}
   }},
   {$lookup: {
       from: 'histories',
       let: { groupCallIdArray: '$groupCallIdArray'},
       pipeline: [
         {$match:{status:'completed',{$expr: {
        $or: [{ callId: {"$in": '$$groupCallIdArray'} }, { connectedCallId: {"$in": '$$groupCallIdArray'} }]}}
         }},
         {$group: {
           _id: {'groupId':'$groupId'},
           from: { $last: '$from' },
           to: { $last: '$to' },
           minimumTime: { $last: '$minimumTime' },
           noOfcalls: {$sum:1},
          duration:{ $sum: '$duration' },
         }}
       ],
      as: results
   }}
  ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多