MongoDB $objectToArray 运算符介绍

$objectToArray 是 MongoDB 中的一个聚合运算符,可以将一个文档转换为一个包含该文档键值对的数组。每个元素都是一个文档,包含两个字段:kv,分别表示原始文档的键和值。

语法

$objectToArray 运算符的语法如下:

{ $objectToArray: <expression> }

其中,<expression> 是要转换为数组的文档表达式,可以是文档字段、聚合表达式等。

使用场景

$objectToArray 运算符可以用于以下场景:

  • 将一个文档转换为数组,方便在聚合管道中进行操作。
  • 动态获取文档的键和值,并对它们进行操作。

示例

示例 1

下面的聚合管道使用 $objectToArray 运算符,将一个文档转换为一个包含该文档键值对的数组:

db.collection.aggregate([
  {
    $project: {
      myDoc: {
        name: "Tom",
        age: 18,
        gender: "male"
      },
      myArray: { $objectToArray: "$myDoc" }
    }
  }
])

执行上述聚合管道后,输出结果如下:

{
  "myDoc": {
    "name": "Tom",
    "age": 18,
    "gender": "male"
  },
  "myArray": [
    {
      "k": "name",
      "v": "Tom"
    },
    {
      "k": "age",
      "v": 18
    },
    {
      "k": "gender",
      "v": "male"
    }
  ]
}

示例 2

下面的聚合管道使用 $objectToArray 运算符和 $group 运算符,将一个集合中的文档按照字段进行分组,并计算每个分组中的文档数量:

db.collection.aggregate([
  {
    $project: {
      myDoc: {
        name: "$name",
        age: "$age",
        gender: "$gender"
      }
    }
  },
  {
    $group: {
      _id: { $objectToArray: "$myDoc" },
      count: { $sum: 1 }
    }
  }
])

执行上述聚合管道后,输出结果如下:

{
  "_id": [
    {
      "k": "name",
      "v": "Tom"
    },
    {
      "k": "age",
      "v": 18
    },
    {
      "k": "gender",
      "v": "male"
    }
  ],
  "count": 1
}
{
  "_id": [
    {
      "k": "name",
      "v": "Lucy"
    },
    {
      "k": "age",
      "v": 20
    },
    {
      "k": "gender",
      "v": "female"
    }
  ],
  "count": 2
}

结论

在 MongoDB 中, $objectToArray 运算符可以将一个对象转换为一个包含键值对的数组。它可以用于将包含对象的字段转换为数组,以便在聚合管道中进行操作。通过将字段转换为数组,可以使用聚合管道中的其他运算符和操作符对其进行操作,这在某些情况下非常有用。