mongodb - Mongodb中的查询操作以查找来自同一集合的两个查询之间的左外层
问题描述
我需要帮助来找到来自同一集合的两个查询之间的左外部。
让我说我有以下记录的一个集合:
{
"_id" : NumberLong(1),
"clientId" : "1",
"requestId" : "100"
}
{
"_id" : NumberLong(2),
"clientId" : "2",
"requestId" : "100"
}
{
"_id" : NumberLong(3),
"clientId" : "3",
"requestId" : "100"
}
{
"_id" : NumberLong(4),
"clientId" : "4",
"requestId" : "100"
}
{
"_id" : NumberLong(5),
"clientId" : "5",
"requestId" : "100"
}
{
"_id" : NumberLong(6),
"clientId" : "6",
"requestId" : "100"
}
{
"_id" : NumberLong(7),
"clientId" : "7",
"requestId" : "100"
}
{
"_id" : NumberLong(8),
"clientId" : "6",
"requestId" : "200"
}
{
"_id" : NumberLong(9),
"clientId" : "7",
"requestId" : "200"
}
{
"_id" : NumberLong(10),
"clientId" : "8",
"requestId" : "200"
}
我收到一个包含两个字段的请求,第一个是“mainRequestId”,另一个是“excludedRequestId”。我需要找到记录哪些客户端 ID 具有“mainRequestId”但不在“excludedRequestId”中。
例如:“mainRequestId”=“100”,“excludedRequestId”=“200”,我应该得到以下记录:
{
"_id" : NumberLong(1),
"clientId" : "1",
"requestId" : "100"
}
{
"_id" : NumberLong(2),
"clientId" : "2",
"requestId" : "100"
}
{
"_id" : NumberLong(3),
"clientId" : "3",
"requestId" : "100"
}
{
"_id" : NumberLong(4),
"clientId" : "4",
"requestId" : "100"
}
{
"_id" : NumberLong(5),
"clientId" : "5",
"requestId" : "100"
}
因为clientId
6 和 7 有requestId
“100”,但有另一条记录,客户端 ID 为 6 和 7,但也有requestId
“200”。
我怎么能用 mongo 查询来做到这一点?
谢谢。
解决方案
您可以尝试聚合管道查询,
$match
检查requestId
等于mainRequestId
$lookup
加入自我收藏$match
clientId
并requestId
与excludedRequestId
$limit
只返回一份文件
$match
检查文档返回结果是否为空 []
let mainRequestId = "100";
let excludedRequestId = "200";
db.collection.aggregate([
{ $match: { requestId: mainRequestId } },
{
$lookup: {
from: "collection",
let: { clientId: "$clientId" },
pipeline: [
{
$match: {
$and: [
{ $expr: { $eq: ["$$clientId", "$clientId"] } },
{ requestId: excludedRequestId }
]
}
},
{ $limit: 1 }
],
as: "hasDoc"
}
},
{ $match: { hasDoc: [] } }
])
推荐阅读
- azure - [警告]找不到键的 loc 字符串:CorrelationIdForARM
- python-3.x - 在列出每个项目后将项目添加到带有输入的空列表
- c# - 是否可以捕获或隐藏非托管异常窗口?
- python - 从接口的 IP 和网络掩码获取网络 IP
- python-3.x - 在熊猫数据框中仅显示重复值序列中的第一个实例的更好方法?
- drupal - Drupal:从 submitForm() 中的控制器调用函数时出现“错误:找不到类”
- javascript - 如何使用 Promise 设置变量的值,然后使用 Express 发布到 db?
- linux - 如何读取套接字接收到的 TCP 段数
- python - 如何在 Python 中求解具有两台服务器的马尔可夫链的大概率矩阵?
- c++ - 段错误、动态数组和函数