【发布时间】: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