首页 > 解决方案 > 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"
}

因为clientId6 和 7 有requestId“100”,但有另一条记录,客户端 ID 为 6 和 7,但也有requestId“200”。

我怎么能用 mongo 查询来做到这一点?

谢谢。

标签: mongodbmongodb-query

解决方案


您可以尝试聚合管道查询,

  • $match检查requestId等于mainRequestId
  • $lookup加入自我收藏
    • $match clientIdrequestIdexcludedRequestId
    • $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: [] } }
])

操场


推荐阅读