描述:将指定文档提升到顶级并替换所有其它字段。该操作会替换输入文档中的所有现在字段,包括_id字段。
操作语法:{$replacRoot: { newRoot:<replacementDocument>}},如果<replacementDocument>不是文档,$replaceRoot 操作将失败。"message" : "'newRoot' expression must evaluate to an object, Type of resulting value: 'string'
1、例如有如下一个文档:
{
"_id" : ObjectId("5d6e0dddaf57ab2d6ce86dd3"),
"name" : "小王",
"p_id" : 5,
"age" : 33,
"hobby" : {
"address" : "bj",
"hometown" : "bt"
}
}
期望显示的结果为:
{
"address" : "bj",
"hometown" : "bt"
}
此时可以利用$replaceRoot 将hobby文档提升到顶层,丢弃当前的顶级字段。
db.xx.aggregate(
{
$replaceRoot: { newRoot: "$hobby" }
}
)
2、$replaceRoot 与$match 的结合使用,有如下文档:
/* 1 createdAt:2019/9/3 下午3:25:20*/
{
"_id" : ObjectId("5d6e1560af57ab2d6ce86dd5"),
"name" : "小康",
"p_id" : 4,
"age" : 31
},
/* 2 createdAt:2019/9/3 下午2:53:17*/
{
"_id" : ObjectId("5d6e0dddaf57ab2d6ce86dd3"),
"name" : "小王",
"p_id" : 5,
"age" : 33,
"hobby" : {
"address" : "bj",
"hometown" : "bt"
}
}
注:文档1 中没有hobby 这个Object,如果直接采用 $replaceRoot:{newRoot:$hobby}来运行会导致前面说过的错误。此时就需要采用$match 管道来过滤掉不包含hobby 字段的文档。
db.xx.aggregate(
{
$match: {
hobby:{$exists: true}
}
},
{
$replaceRoot: { newRoot: "$hobby" }
}
)
3、使用replaceRoot 创建新文档,基于上面的结果,可以把address和hometown 组合成一个新文档
db.kk.aggregate(
{
$match: {
hobby:{$exists: true}
}
},
{
$replaceRoot: { newRoot: "$hobby" }
},
{
$replaceRoot: {
newRoot: {
full_address:{
$concat: ["$address","-","$hometown" ]
}
}
}
}
)
最终输出的结果为:
{
"full_address" : "bj-bt"
}