如何在 MongoDB 查询中加入多个文档
How to join multiple documents in a MongoDB query
我是 MongoDB 的新手。我从事过 Legacy Mainframe 和 DB2 Database 方面的工作。
我的要求如下 -
我有一个集合说 Logs,其中的字段名为 CaseNum、ProcessingStage、 body1 和 body2。集合中的文档如下所示
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"
]
}
]
我是 MongoDB 的新手。我从事过 Legacy Mainframe 和 DB2 Database 方面的工作。 我的要求如下 - 我有一个集合说 Logs,其中的字段名为 CaseNum、ProcessingStage、 body1 和 body2。集合中的文档如下所示
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"
]
}
]