使用 mongoldb 提取唯一对象

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

我尝试为 MongoDB 构建一个查询,通过键值 (

batch_id
) 从文档中的数组返回所有唯一值。我已经成功地做到了这一点,将唯一的
batch_ids
分组,但是我无法提取相应的键值 (
batchName
) 并计算每个数组具有唯一值的对象的数量。

如何提取

batchName
并计算对象数量?我已经尝试了一些方法,但我认为我遇到了问题
$addToSet

MongoPlayground:https://mongoplayground.net/p/j6Jkeh79Zqq

我当前的输出是:

[
  {
    "_id": "6032a5ad80443334a35f2232",
    "batchData": [
      {
        "batch_id": "6032a5af80443334a35f2267TB"
      },
      {
        "batch_id": "6032a5af80443334a35f26467JC"
      },
      {
        "batch_id": "6032a5af80443334a5f74367UI"
      }
    ]
  }
]

我的预期输出是

    [
      {
        "_id": "6032a5ad80443334a35f2232",
        "batchData": [
          {
            "batch_id": "6032a5af80443334a35f2267TB",
            "batchName": "Test 2",
            "count": 2
          },
          {
            "batch_id": "6032a5af80443334a35f26467JC",
            "batchName": "Test 3",
            "count": 1
          },
          {
            "batch_id": "6032a5af80443334a5f74367UI",
            "batchName": "Test 1",
            "count": 2
          }
        ]
      }
    ]

示例文档:

[
  {
    "_id": "6032a5ad80443334a35f2232",
    "List": [
      {
        "_id": "6032a5af80443334a35f2234",
        "batch_id": "6032a5af80443334a5f74367UI",
        "batchName": "Test 1",
        
      },
      {
        "_id": "6032a5b080443334a35f2236",
        "batch_id": "6032a5af80443334a5f74367UI",
        "batchName": "Test 1",
        
      },
      {
        "_id": "6032a5b080443334a35f2238",
        "batch_id": "6032a5af80443334a35f2267TB",
        "batchName": "Test 2",
        
      },
      {
        "_id": "6032a5b080443334a35f2239",
        "batch_id": "6032a5af80443334a35f2267TB",
        "batchName": "Test 2",
        
      },
      {
        "_id": "6032a5b080443334a35f2234",
        "batch_id": "6032a5af80443334a35f26467JC",
        "batchName": "Test 3",
        
      }
    ]
  }
]

蒙戈查询:

db.collection.aggregate([
  {
    $project: {
      batchData: {
        batch_id: "$List.batch_id",
        
      },
      
    },
    
  },
  {
    $unwind: "$batchData.batch_id"
  },
  {
    $group: {
      _id: "$_id",
      batchData: {
        $addToSet: "$batchData"
      },
      
    },
    
  },
  
])
mongodb mongodb-query
1个回答
2
投票

您可以先

$unwind
展平阵列以便于处理。之后,您可以再次
$group
数据并使用
$first
获取batchName。最后,您可以再次执行
$group
来格式化为您期望的格式。

db.collection.aggregate([
  {
    "$unwind": "$List"
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        batch_id: "$List.batch_id"
      },
      batchName: {
        $first: "$List.batchName"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      batchData: {
        $push: {
          "batch_id": "$_id.batch_id",
          "batchName": "$batchName",
          "count": "$count"
        }
      }
    }
  }
])

这里是Mongo游乐场供您参考。

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