Mongodb Mongo查询以聚合Robo3T中整个集合中的数组大小

Mongodb Mongo查询以聚合Robo3T中整个集合中的数组大小,mongodb,mongodb-query,robo3t,Mongodb,Mongodb Query,Robo3t,在这里,我在mongo集合“Order”中附加了我的实际文档结构,我需要找到整个集合中LineValueKey(数组中的元素)的计数(我的意思是,我需要聚合整个集合中LineValue数组的大小),假设我的集合中有这两个文档,那么LineValueKey的计数应该返回4。为此,我试图找出mongo查询 我已经在Robo 3T 1.2.1中尝试了下面的查询,但是对于我的实际mongo文档结构,我得到了下面的错误,但是相同的查询适用于不同的mongo结构。 但我需要计算查询以计算实际mongo文档结

在这里,我在mongo集合“Order”中附加了我的实际文档结构,我需要找到整个集合中LineValueKey(数组中的元素)的计数(我的意思是,我需要聚合整个集合中LineValue数组的大小),假设我的集合中有这两个文档,那么LineValueKey的计数应该返回4。为此,我试图找出mongo查询

我已经在Robo 3T 1.2.1中尝试了下面的查询,但是对于我的实际mongo文档结构,我得到了下面的错误,但是相同的查询适用于不同的mongo结构。 但我需要计算查询以计算实际mongo文档结构的LineValueKey。有人能帮忙吗

Query: db.getCollection('Order').aggregate([{$group: { _id: null, totalSize: { $sum: { $size: "$LineValue"}}} }])

正如前面指出的,$size需要一个数组才能工作。必须将LineValue字段从对象转换为数组。 要执行此操作,请使用stage with operator

db.collection.aggregate([
    {
        $project: {
          LineValue: {
            $objectToArray: "$LineValue"
          }
        }
      }
])
它将生成如下文档:

{
    "LineValue": [
      {
        "k": "LineValueKey [uomCode=01]",
        "v": {
          "costAmt": 2.78,
          "packQty": 1,
          "retailAmt": 3.38,
          "uomCode": "01"
        }
      },
      {
        "k": "LineValueKey [uomCode=02]",
        "v": {
          "costAmt": 2.78,
          "packQty": 1,
          "retailAmt": 3.38,
          "uomCode": "02"
        }
      }
    ]
  },
然后,您可以应用$group阶段,并计算阵列大小。以下是完整的汇总:

db.collection.aggregate([
  {
    $project: {
      LineValue: {
        $objectToArray: "$LineValue"
      }
    }
  },
   {
    $group: {
      _id: null,
      totalSize: {
        $sum: {
          $size: "$LineValue"
        }
      }
    }
  }
])
结果将与提供的数据一致:

[
  {
    "_id": null,
    "totalSize": 4
  }
]

正如前面指出的,$size需要一个数组才能工作。必须将LineValue字段从对象转换为数组。 要执行此操作,请使用stage with operator

db.collection.aggregate([
    {
        $project: {
          LineValue: {
            $objectToArray: "$LineValue"
          }
        }
      }
])
它将生成如下文档:

{
    "LineValue": [
      {
        "k": "LineValueKey [uomCode=01]",
        "v": {
          "costAmt": 2.78,
          "packQty": 1,
          "retailAmt": 3.38,
          "uomCode": "01"
        }
      },
      {
        "k": "LineValueKey [uomCode=02]",
        "v": {
          "costAmt": 2.78,
          "packQty": 1,
          "retailAmt": 3.38,
          "uomCode": "02"
        }
      }
    ]
  },
然后,您可以应用$group阶段,并计算阵列大小。以下是完整的汇总:

db.collection.aggregate([
  {
    $project: {
      LineValue: {
        $objectToArray: "$LineValue"
      }
    }
  },
   {
    $group: {
      _id: null,
      totalSize: {
        $sum: {
          $size: "$LineValue"
        }
      }
    }
  }
])
结果将与提供的数据一致:

[
  {
    "_id": null,
    "totalSize": 4
  }
]

$size仅接受数组,在第二个条目中,LineValue似乎是一个objectok,在我的示例中,LineValue实际上是一个包含映射的列表。如何将其转换为数组,需要在java pojo中添加任何注释以将其序列化为数组?$size仅接受数组,在第二个条目中,LineValue似乎是一个objectok,在我的示例中,LineValue实际上是一个包含映射的列表。如何将其转换为数组,需要在JavaPOJO中添加任何注释以将其序列化为数组?非常感谢,这个查询真的很有效!!!我将进一步挖掘您的查询,以探索更多,因为我是新的Mongo。非常感谢您,这个查询真的很有效!!!我将进一步挖掘您的查询,以探索更多,因为我是新的Mongo。