mongodb Aggregation聚合操作之$replaceRoot

在上一篇?mongodb Aggregation聚合操作之$sortByCount?中詳細(xì)介紹了mongodb聚合操作中的$sortByCount使用以及參數(shù)細(xì)節(jié)砸泛。本篇將開始介紹Aggregation聚合操作中的$replaceRoot操作。

說明:

用指定的文檔替換輸入文檔裤翩。該操作將替換輸入文檔中的所有現(xiàn)有字段嚷往,包括_id字段。您可以將現(xiàn)有的嵌入文檔提升到頂層吧彪,或者創(chuàng)建一個用于提升的新文檔

語法:

{ $replaceRoot: { newRoot: <replacementDocument> } }

1.?示例

1.1.?簡單示例


初始化數(shù)據(jù):

db.replaceRootExample.insertMany([

???{ "_id": 1, "name" : { "first" : "John", "last" : "Backus" } },

???{ "_id": 2, "name" : { "first" : "John", "last" : "McCarthy" } },

???{ "_id": 3, "name": { "first" : "Grace", "last" : "Hopper" } },

???{ "_id": 4, "firstname": "Ole-Johan", "lastname" : "Dahl" },

])


注意:【如果文檔記錄中有replacementDocument的字段不存在會報錯慌申,例如下面這個示例雷激,在第四條記錄中name字段不存在】

示例:

db.replaceRootExample.aggregate([

???{ $replaceRoot: { newRoot: "$name" } }

])

會報:MongoError: 'newRoot' expression must evaluate to an object, but resulting value was: MISSING. Type of resulting value: 'missing'. Input document: {}

可以使用$mergeObjects將名稱文檔合并到某個默認(rèn)文檔中解決這個錯誤

db.replaceRootExample.aggregate([

???{ $replaceRoot: { newRoot: { $mergeObjects: [ { _id: "$_id", first: "", last: "" }, "$name" ] } } }

])

或者访圃,您可以跳過缺少name字段的文檔厨幻,通過包含$match階段來檢查文檔字段是否存在,然后再將文檔傳遞到$replaceRoot階段:


db.replaceRootExample.aggregate([

???{ $match: { name : { $exists: true, $not: { $type: "array" }, $type: "object" } } },

???{ $replaceRoot: { newRoot: "$name" } }

])


或者腿时,您可以使用$ifNull表達(dá)式指定其他一些文檔為根文檔;例如:

db.replaceRootExample.aggregate([

???{ $replaceRoot: { newRoot: { $ifNull: [ "$name", { _id: "$_id", missingName: true} ] } } }

])

1.2.?嵌入文檔字段示例


初始化數(shù)據(jù):

db.people.insertMany([{ "_id" : 1, "name" : "Arlene", "age" : 34, "pets" : { "dogs" : 2, "cats" : 1 } },

{ "_id" : 2, "name" : "Sam", "age" : 41, "pets" : { "cats" : 1, "fish" : 3 } },

{ "_id" : 3, "name" : "Maria", "age" : 25 }])


示例:

db.people.aggregate( [

???{ $replaceRoot: { newRoot: { $mergeObjects: ?[ { dogs: 0, cats: 0, birds: 0, fish: 0 }, "$pets" ] }} }

] )


結(jié)果:

{ "dogs" : 2, "cats" : 1, "birds" : 0, "fish" : 0 }

{ "dogs" : 0, "cats" : 1, "birds" : 0, "fish" : 3 }

{ "dogs" : 0, "cats" : 0, "birds" : 0, "fish" : 0 }

1.3.?數(shù)組中嵌套文檔示例


初始化數(shù)據(jù):

db.students.insertMany([

???{

??????"_id" : 1,

??????"grades" : [

?????????{ "test": 1, "grade" : 80, "mean" : 75, "std" : 6 },

?????????{ "test": 2, "grade" : 85, "mean" : 90, "std" : 4 },

?????????{ "test": 3, "grade" : 95, "mean" : 85, "std" : 6 }

??????]

???},

???{

??????"_id" : 2,

??????"grades" : [

?????????{ "test": 1, "grade" : 90, "mean" : 75, "std" : 6 },

?????????{ "test": 2, "grade" : 87, "mean" : 90, "std" : 3 },

?????????{ "test": 3, "grade" : 91, "mean" : 85, "std" : 4 }

??????]

???}

])


示例:

db.students.aggregate( [

???{ $unwind: "$grades" },

???{ $match: { "grades.grade" : { $gte: 90 } } },

???{ $replaceRoot: { newRoot: "$grades" } }

] )


結(jié)果:

{ "test" : 3, "grade" : 95, "mean" : 85, "std" : 6 }

{ "test" : 1, "grade" : 90, "mean" : 75, "std" : 6 }

{ "test" : 3, "grade" : 91, "mean" : 85, "std" : 4 }

1.4.?連接原有文檔中多個作為一個字段


初始化數(shù)據(jù):

db.contacts.insertMany([{ "_id" : 1, "first_name" : "Gary", "last_name" : "Sheffield", "city" : "New York" },

{ "_id" : 2, "first_name" : "Nancy", "last_name" : "Walker", "city" : "Anaheim" },

{ "_id" : 3, "first_name" : "Peter", "last_name" : "Sumner", "city" : "Toledo" }])


示例:

db.contacts.aggregate( [

???{

??????$replaceRoot: {

?????????newRoot: {

????????????full_name: {

???????????????$concat : [ "$first_name", " ", "$last_name" ]

????????????}

?????????}

??????}

???}

] )


{ "full_name" : "Gary Sheffield" }

{ "full_name" : "Nancy Walker" }

{ "full_name" : "Peter Sumner" }

1.5.?使用從$$ROOT和默認(rèn)文檔創(chuàng)建的新文檔


初始化字段:

db.contacts.insert([

???{ "_id" : 1, name: "Fred", email: "fred@example.net" },

???{ "_id" : 2, name: "Frank N. Stine", cell: "012-345-9999" },

???{ "_id" : 3, name: "Gren Dell", home: "987-654-3210", email: "beo@example.net" }

]);


示例:

db.contacts.aggregate([

???{ $replaceRoot: { newRoot: { $mergeObjects: [ { _id: "", name: "", email: "", cell: "", home: "" }, "$$ROOT" ] } } }

])


結(jié)果:

{ "_id" : 1, "name" : "Fred", "email" : "fred@example.net", "cell" : "", "home" : "" }

{ "_id" : 2, "name" : "Frank N. Stine", "email" : "", "cell" : "012-345-9999", "home" : "" }

{ "_id" : 3, "name" : "Gren Dell", "email" : "beo@example.net", "cell" : "", "home" : "987-654-3210" }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末况脆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子批糟,更是在濱河造成了極大的恐慌格了,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跃赚,死亡現(xiàn)場離奇詭異笆搓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纬傲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門满败,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叹括,你說我怎么就攤上這事算墨。” “怎么了汁雷?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵净嘀,是天一觀的道長。 經(jīng)常有香客問我侠讯,道長挖藏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任厢漩,我火速辦了婚禮膜眠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溜嗜。我一直安慰自己宵膨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布炸宵。 她就那樣靜靜地躺著辟躏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪土全。 梳的紋絲不亂的頭發(fā)上捎琐,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音裹匙,去河邊找鬼野哭。 笑死,一個胖子當(dāng)著我的面吹牛幻件,可吹牛的內(nèi)容都是我干的拨黔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼绰沥,長吁一口氣:“原來是場噩夢啊……” “哼篱蝇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徽曲,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤零截,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秃臣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涧衙,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡哪工,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弧哎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雁比。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撤嫩,靈堂內(nèi)的尸體忽然破棺而出偎捎,到底是詐尸還是另有隱情,我是刑警寧澤序攘,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布茴她,位于F島的核電站,受9級特大地震影響程奠,放射性物質(zhì)發(fā)生泄漏丈牢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一瞄沙、第九天 我趴在偏房一處隱蔽的房頂上張望赡麦。 院中可真熱鬧,春花似錦帕识、人聲如沸泛粹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晶姊。三九已至,卻和暖如春伪货,著一層夾襖步出監(jiān)牢的瞬間们衙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工碱呼, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蒙挑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓愚臀,卻偏偏與公主長得像忆蚀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姑裂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容