编写聚合 MongoDB 查询来计算字段计数 ID

writing aggregate MongoDB query to calculate field count ids

我正在为以下记录和输出编写聚合查询。

数据:

[
    { 
        "_id" : ObjectId("5f3b2626927b18001db86884"), 
        "collections" : [
            Art, Craft
        ]
     },{ 
        "_id" : ObjectId("5f3b2626927b18001db86885"), 
        "collections" : [
            Craft
        ]
     },{ 
        "_id" : ObjectId("5f3b2626927b18001db86886"), 
        "collections" : [
            Apex, Art
        ]
     },
     ...
]

预期输出:

集合 ID 的数量

{
   Art : 2,
   Craft : 2,
   Apex : 1
}

现在,我们正在循环遍历集合以计算每个集合的计数作为所需的输出,但它的性能很低,因为这个集合由 10,000 条记录组成。

所以,我正在考虑构建一个聚合查询,如果有人可以帮助我开始或指出正确的方向,我将不胜感激。谢谢。

查了一段时间想出了解决办法

db.getCollection("collectionName").aggregate(
    [
        // get all the records with at least one collection name
        {
            $match: {
                "collections.0": { $exists: true }
            }
        },

        // populate the collection record
        {
            $lookup: {
                from: "from_collection",
                localField: "localField",
                foreignField: "foreignField",
                as: "collections"
            }
        },

        // unwind
        { $unwind: "$collections" },

        // group by the collections._id
        { $group: { _id: "$collections._id", collections: { $push: "$$ROOT.ID" } } },
        
        // project with collection contains _id, and count
        {
            $project : {
                 collections: "$collections",
                 count: { $size: "$collections" }
            }
        }
    ]
).toArray();

输出:

[
    {
        "_id" : ObjectId("61c4c42d68579f00311dd3e1"), 
        "collections" : [
            "015151", 
            "015152", 
            "015153"
        ], 
        "count" : 3.0
    }, 
    {
        "_id" : ObjectId("615f38016f40710033699939"), 
        "collections" : [
            "014871"
        ], 
        "count" : 1.0
    }, 
    {
        "_id" : ObjectId("611fed5ee0d12c00337cb009"), 
        "collections" : [
            "014788", 
            "014786", 
            "014789", 
            "014787", 
            "014884", 
            "014893", 
            "014967", 
            "014968", 
            "015016", 
            "015017"
        ], 
        "count" : 10.0
    }
    ...
]
  • $unwind
  • $group
  • $group
  • $replaceRoot
db.collection.aggregate([
  {
    $unwind: "$collections"
  },
  {
    "$group": {
      "_id": "$collections",
      "v": {
        "$sum": 1
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "collections": {
        "$push": {
          $arrayToObject: [
            [ { "k": "$$ROOT._id", "v": "$$ROOT.v" } ]
          ]
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: "$collections"
      }
    }
  }
])

mongoplayground