将集合加入到相同的集合名称。 (MongoDB 查询)

问题描述 投票:0回答:1

是否可以使用不同的 $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 }

我想显示所有唯一的交易代码,并且在员工代码中会有一个条件:

  • 如果 isactive 为 true,则显示员工代码
  • 如果交易代码由 1 个或多个员工代码组成,则仅显示具有 isactive: true 的员工代码
  • 如果交易代码由 1 个或多个同时具有 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}

} }

提前谢谢您!

mongodb mongodb-query
1个回答
0
投票

您可以使用

$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供您参考。

© www.soinside.com 2019 - 2024. All rights reserved.