假设我在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实现此功能有任何想法吗?
答案 0 :(得分:1)
您可以使用条件语句添加项目阶段:
db.lx.aggregate([{
$project : {
"_id" : 1,
"tmp" : {
$cond : {
if : {
$eq : ["$tmp", []]
},
then : [null],
else : "$tmp"
}
}
}
}, {
"$unwind" : {
path : "$tmp"
}
}
])