如何在 MongoDB 查询中加入多个文档

How to join multiple documents in a MongoDB query

我是 MongoDB 的新手。我从事过 Legacy Mainframe 和 DB2 Database 方面的工作。 我的要求如下 - 我有一个集合说 Logs,其中的字段名为 CaseNumProcessingStage body1body2。集合中的文档如下所示

Doc1 - CaseNum: '123', ProcessingStage: 'Start', body1: {data object1}
Doc2 - CaseNum: '123', ProcessingStage: 'Error', body2: {data object2}
Doc3 - CaseNum: '123', ProcessingStage: 'Success', body2: {data object2}
Doc4 - CaseNum: '456', ProcessingStage: 'Start', body1: {data object3}
Doc5 - CaseNum: '456', ProcessingStage: 'Error', body2: {data object4}
Doc6 - CaseNum: '789', ProcessingStage: 'Start', body1: {data object5}

我需要从 ProcessingStage 为 'Start' 的文档中提取 body1 字段,其中 CaseNum 有一个 'Error' 文档并且没有 'Success' 文件。 因此,在此示例中,MongoDB 查询应该从 CaseNum '456' 的 Doc4 中获取 body1,因为它有一个 'Error' 文档 Doc5 而没有 'Success' 文档。
CaseNum '123' 有一个 'Error' 文件,但由于它也有一个 'Success' 文件,所以它没有达到所需的条件,并且 CaseNum '789' 没有 'Error' 文档,因此它也不符合所需条件。

抱歉,如果我无法正确解释我的问题。 请帮忙

要合并 MongoDB 中的多个文档,请使用 aggregate()。 假设我们有一个名为 demoDocument:

的文档
{ "_id" : "101", "Name" : "Chris", "details" : [ { "CountryName" : "US", "Age" : 21 } ], "Price" : 50 }
{ "_id" : "102", "Name" : "Chris", "details" : [ { "CountryName" : "UK", "Age" : 22 } ], "Price" : 78 }
{ "_id" : "103", "Name" : "Chris", "details" : [ { "CountryName" : "US", "Age" : 21 } ], "Price" : 50 }

以下是在MongoDB中合并多个文档的查询-

> db.demo436.aggregate([
       {$sort: {_id: 1, Name: 1}},
       {$unwind: '$details'},
       {$group: {_id: '$Name', details: {$push: '$details'},
       Price: {$sum: '$Price'},
       id: {$last: {$concat: ["$_id", "_", "AppendedValue" ]}},
       Name: {$last: '$Name'}}},
       {$addFields: {Id: 'NewIdAppped', _id: '$id'}},
       {$project: {"id": 0 }}])

这样做会产生以下输出:

{
    "_id": "103_AppendedValue",
    "details": [{
        "CountryName": "US",
        "Age": 21
    }, {
        "CountryName": "UK",
        "Age": 22
    }, {
        "CountryName": "US",
        "Age": 21
    }],
    "Price": 178,
    "Name": "Chris",
    "Id": "NewIdAppped"
}

希望你得到了你正在寻找的答案。

您需要使用聚合来实现此目的。这是一种可能的解决方案

db.collection.aggregate([
 // group all docs by case num
 {
  $group: {
    _id: "$CaseNum",
    processingStages: {
      $push: "$ProcessingStage"
    },
   // only get body 1 from start stage
   body1: {
    $push: {
      $cond: [
        {
          $eq: [
            "$ProcessingStage",
            "Start"
          ]
        },
        "$body1",
        "$$REMOVE"
      ]
    }
  }
 }
},
// check your condition,
// case shouldn't have success and must have error
{
 $match: {
  $and: [
    {
      processingStages: {
        $in: [
          "Error"
        ]
      }
     },
     {
       processingStages: {
        $nin: [
          "Success"
        ]
      }
    }
  ]
 }
},
// extract body1 as object
{
  "$unwind": "$body1"
}])

这是您的结果

[
 {
  "_id": "456",
  "body1": {
   "data": {}
  },
  "processingStages": [
    "Start",
    "Error"
  ]
 }
]

游乐场link:https://mongoplayground.net/p/RRQax-S2WbA