您的位置:

MongoDB unwind详解

一、概述

MongoDB unwind是MongoDB中一个非常强大的操作,它能够将数组类型的数据分解成单独的文档,从而方便对这些文档进行CRUD操作。 通常情况下,我们使用MongoDB的聚合操作的时候,需要使用unwind操作将数组类型的数据显示为多个文档,然后才能够进行下一步的操作。

二、使用场景

unwind操作非常适合解决一些特定的场景问题,例如:

1、数组类型的排序问题

假设我们有这样一张表:

{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "hobbies" : [ "reading", "swimming", "travelling" ]
}

现在我们想要根据hobbies字段中的内容进行排序,这个时候就可以使用unwind操作将hobbies展开为多个文档,然后进行排序操作。

db.test.aggregate([
   { $unwind : "$hobbies" },
   { $sort : { name : 1, "hobbies" : -1 } }
]);

2、数组类型的统计问题

假设我们有这样一张表:

{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "scores" : [ 90, 80, 70 ]
}

现在我们想要统计每个人的平均分数,这个时候就可以使用unwind操作将scores展开为多个文档,然后进行平均分数的统计操作。

db.test.aggregate([
   { $unwind : "$scores" },
   {
     $group : {
        _id : "$name",
        avgScore : { $avg : "$scores" }
     }
   }
]);

3、数组类型的过滤查询问题

假设我们有这样一张表:

{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "results" : [
        {
            "subject" : "math",
            "score" : 80
        },
        {
            "subject" : "english",
            "score" : 90
        }
    ]
}

现在我们想要查询math分数大于80分的人,这个时候就可以使用unwind操作将results展开为多个文档,然后进行过滤查询操作。

db.test.aggregate([
   { $unwind : "$results" },
   { $match : { "results.subject" : "math", "results.score" : { $gt : 80 } } }
]);

三、unwind操作的语法

unwind操作的语法非常简单,只需要在聚合操作中使用$unwind操作符即可。

db.collection.aggregate([
   { $unwind : "arrayFieldName" }
]);

其中,arrayFieldName表示需要拆分的数组类型的字段名称。

四、unwind操作的参数及含义

$unwind操作支持多个参数,并且每个参数都有特定的含义。

1、path参数

path参数是unwind操作必须的参数,它用于指定需要展开的数组字段名称。

db.collection.aggregate([
   { $unwind : "$arrayFieldName" }
]);

2、includeArrayIndex参数

includeArrayIndex参数表示是否需要将数组下标信息包含在展开后的文档中,默认情况下这个参数为false。

db.collection.aggregate([
   { $unwind : { path: "$arrayFieldName", includeArrayIndex: "string" } }
]);

3、preserveNullAndEmptyArrays参数

preserveNullAndEmptyArrays参数表示是否需要展开空数组。

db.collection.aggregate([
   { $unwind : { path: "$arrayFieldName", 
                 preserveNullAndEmptyArrays: true } }
]);

4、unwind操作的示例代码

假设我们有这样一张表:

{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "hobbies" : [ "reading", "swimming", "travelling" ]
}

现在我们来看看如何使用unwind进行展开操作:

db.test.aggregate([
   { $unwind : "$hobbies" }
]);

执行以上操作后,展开后的文档如下:

{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "hobbies" : "reading"
},
{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "hobbies" : "swimming"
},
{
    "_id" : 1,
    "name" : "John Smith",
    "age" : 25,
    "hobbies" : "travelling"
}

五、总结

通过以上的介绍,我们可以知道,unwind操作是MongoDB中非常实用的一个操作符,它可以将数组类型的数据展开成多个文档,方便对这些文档进行下一步的操作。需要注意的是,在使用unwind操作的时候,一定要先考虑清楚自己的需求,然后再合理的使用相关参数进行操作,这样可以避免一些无谓的麻烦。