没有preserveNullAndEmptyArrays

时间:2016-09-12 09:54:48

标签: mongodb aggregation-framework

假设我在MongoDB集合中有以下文档(这只是我的真实数据的简化版本):

/* 1 */
{
    "_id" : "objectives/core/1001",
    "tmp" : [ 
        {
            "name" : "analysisType"
        }, 
        {
            "name" : "sampleFormat"
        }
    ]
}
/* 2 */
{
    "_id" : "objectives/core/1003",
    "tmp" : [ 
        {
            "name" : "analysisType"
        }
    ]
}
/* 3 */
{
    "_id" : "objectives/core/1004",
    "tmp" : []
}

请注意,最后一个文档包含空tmp数组。

我用Mongo 3.2编写了一个聚合查询,它“展开”tmp并保留空数组:

db.entities.aggregate({ "$unwind" : { path: "$tmp", preserveNullAndEmptyArrays: true } } );

这是我的(期望的)输出:

/* 1 */
{
    "_id" : "objectives/core/1001",
    "tmp" : { "name" : "analysisType" }
}
/* 2 */
{
    "_id" : "objectives/core/1001",
    "tmp" : {
        "name" : "sampleFormat"
    }
}
/* 3 */
{
    "_id" : "objectives/core/1003",
    "tmp" : { "name" : "analysisType" }
}
/* 4 */
{ "_id" : "objectives/core/1004" }

然而,这不适用于旧版MongoDB,因为它们不支持preserveNullAndEmptyArrays属性 - 他们的常规 unwind操作(没有该属性)不会从上面的清单中生成第4号文件。您对如何使用Mongo3.0实现此功能有任何想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用条件语句添加项目阶段:

db.lx.aggregate([{
            $project : {
                "_id" : 1,
                "tmp" : {
                    $cond : {
                        if  : {
                            $eq : ["$tmp", []]
                        },
                    then : [null],
                    else  : "$tmp"
                }
            }
        }
    }, {
        "$unwind" : {
            path : "$tmp"
        }
    }
])