是否可以使用不同的 $match 将集合连接到自身?
我有以下相同的使用案例
数据:
{ "_id" : 1, "transactioncode" : "testtransactAA", "staffcode" : "staffA1", "isactive" : true }
{ "_id" : 2, "transactioncode" : "testtransactBB", "staffcode" : "staffB1", "isactive" : true }
{ "_id" : 3, "transactioncode" : "testtransactCC", "staffcode" : "staffC1", "isactive" : false }
{ "_id" : 4, "transactioncode" : "testtransactCC", "staffcode" : "staffC2", "isactive" : false }
{ "_id" : 5, "transactioncode" : "testtransactDD", "staffcode" : "staffD1", "isactive" : true }
{ "_id" : 6, "transactioncode" : "testtransactEE", "staffcode" : "staffE1", "isactive" : true }
{ "_id" : 7, "transactioncode" : "testtransactEE", "staffcode" : "staffE2", "isactive" : false }
我想显示所有唯一的交易代码,并且在员工代码中会有一个条件:
输出将是:
{ "transactioncode" : "testtransactAA", "staffcode" : "staffA1"}
{ "transactioncode" : "testtransactBB", "staffcode" : "staffB1"}
{ "transactioncode" : "testtransactCC", "staffcode" : null}
{ "transactioncode" : "testtransactDD", "staffcode" : "staffD1"}
{ "transactioncode" : "testtransactDD", "staffcode" : "staffE1"}
我的代码是我试图重新加入相同的表名,但它只获取具有 isactive:true 的文档并忽略那些具有 false 状态的员工代码的文档
{
runCommand: {
aggregate: "operationsmonitoring",
pipeline: [
{ $lookup: { from: 'operationsmonitoring', localField:'_id', foreignField: '_id', as: 'getIsactive' } },
{ $unwind: { path: '$getIsactive', preserveNullAndEmptyArrays: true } },
{$match:{'getIsactive.isactive':true } },
{
$project:{
"transactioncode":"$transactioncode",
"staffcode":"$staffcode"
}
}
],
"cursor": {batchSize:100000}
} }
提前谢谢您!
您可以使用
$lookup
中的子管道仅查找isActive:true
记录。
db.collection.aggregate([
{
$lookup: {
from: "collection",
let: {
rawId: "$_id"
},
pipeline: [
{
"$match": {
$expr: {
$and: [
{
$eq: [
"$$rawId",
"$_id"
]
},
{
$eq: [
"$isactive",
true
]
}
]
}
}
}
],
as: "getIsactive"
}
},
{
$unwind: {
path: "$getIsactive",
preserveNullAndEmptyArrays: true
}
},
{
$project: {
"transactioncode": "$transactioncode",
"staffcode": {
"$ifNull": [
"$getIsactive.staffcode",
null
]
}
}
},
{
$group: {
_id: "$transactioncode",
staffcode: {
$first: "$staffcode"
}
}
}
])
这里是Mongo Playground供您参考。