MongoDB, out, merge
在 SQL 當中我們很常使用 INSERT INTO SELECT
語法,查詢後直接寫到新的 table。很慶幸的是 MQL 也同樣支援這個語法,就是 aggregation 內的 out
!
關於 out
,是比較早推出的版本(2.6),後面有推出新的語法叫做 merge
,是更進階與細節的語法。
out
可視為較陽春的版本,如果沒複雜操作,使用 out
即可,之後再做 merge
的說明。
1 2
| { $out: { db: "<output-db>", coll: "<output-collection>" } }
|
out
語法僅有兩個參數,db
與 coll
,分別是要輸出的資料庫以及集合。
out
僅能在 aggregation pipeline 中使用,且必須是最後一個執行的階段,也就是說在前面可以執行任何的資料篩選、操作和轉型,最終輸入到目的地。
另外要補充的是,如果目的地已經有資料,會無條件直接覆蓋
首先我們看看範例資料庫有這兩個集合,這邊使用 people
集合來當範例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| > show collections people restaurants
> db.people.findOne() { "_id" : ObjectId("57d7a121fa937f710a7d4873"), "last_name" : "White", "quote" : "Aspernatur illo inventore fuga eius fugiat similique corrupti tempore.", "job" : "Furniture designer", "ssn" : "719-19-0104", "address" : { "city" : "Lake Meaganton", "state" : "Idaho", "street" : "9105 Adkins Ramp", "zip" : "10914-3394" }, "first_name" : "Olivia", "company_id" : ObjectId("57d7a121fa937f710a7d486d"), "employer" : "Terry and Sons", "birthday" : ISODate("2011-03-12T05:59:36Z"), "email" : "[email protected]" }
|
我們目標是把 job 是 Furniture designer
的人搬到新的集合叫做 designer
去
先來查看看全體有多少人以及符合對象的有多少人
1 2 3 4 5
| > db.people.count() 50474
> db.people.count({'job':'Furniture designer'}) 86
|
這樣預期會有 86
個人在新的集合內
開始組裝 aggregation 語法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| > db.people.aggregate([ ... {$match: { 'job': 'Furniture designer'}}, ... {$out: 'designer'} ... ])
> show collections designer people restaurants
> db.designer.count() 86
|
這樣就大功告成囉~
要切記,使用 db 語法必須是 4.4 版本後才支援