【问题标题】:MongoDB Aggregation query with unwind without preserveNullAndEmptyArraysMongoDB聚合查询与展开没有preserveNullAndEmptyArrays
【发布时间】:2016-09-12 09:54:48
【问题描述】:

假设我在 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 实现这个吗?

【问题讨论】:

标签: mongodb aggregation-framework


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2019-06-18
    • 2019-03-04
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多