提问者:小点点

如何在mongodb中查找大于文档大小的数组


我有如下模式

[
{
 id:"111"
 tags:[222,333,444,555]
},
{
 id: "222"
 tags:[312,345,534]
},
{
 id:"333"
 tags:[111,222,333,444,555]
},

]

我想找到所有的文档,其中标签数组大小大于由$match在聚合管道返回的文档大小,所以在上面,例如文档的数量是3,所以我想返回所有的文档,标签数组大小大于3

[
{
 id:"111"
 tags:[222,333,444,555]
},
{
 id:"333"
 tags:[111,222,333,444,555]
},

]

我正在使用聚合管道来处理其他信息,我被困在如何存储文档大小以便我可以找到所有大于文档大小的标签

下面是我正在使用的查询,我想在聚合和一次调用中做它

.aggregate([
        
   {
      "$match":{
         "ids":{
            "$in":[
               "111",
               "222",
                "333"
            ]
         }
      }
   })]

共1个答案

匿名用户

Facet帮你解决这个问题。

  • $facet有助于对传入文档进行分类。我们使用totaldoc对文档进行计数,使用alldocuments获取所有文档
  • $arrayelemat有助于从TotalDoc获取第一个对象,我们已经知道在TotalDoc中应该只有一个对象。因为当我们对它进行分组时,我们使用_id:null
  • $unwind有助于解除AllDocuments数组的结构

这是代码

db.collection.aggregate([
  {
    $facet: {
      totalDoc: [
        {
          $group: {
            _id: null,
            count: {
              $sum: 1
            }
          }
        }
      ],
      allDocuments: [
        {
          $project: {
            tags: 1
          }
        }
      ]
    }
  },
  {
    $addFields: {
      totalDoc: {
        "$arrayElemAt": [
          "$totalDoc",
          0
        ]
      }
    }
  },
  {
    $unwind: "$allDocuments"
  },
  {
    $addFields: {
      sizeGtDoc: {
        $gt: [
          {
            $size: "$allDocuments.tags"
          },
          "$totalDoc.count"
        ]
      }
    }
  },
  {
    $match: {
      sizeGtDoc: true
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$allDocuments"
    }
  }
])

工作蒙哥游乐场