MongoDB $out 教學 (如同 SQL 的 SELECT INTO! )

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>" } }
// 補充,4.4 之後的版本才支援指定 db 語法唷

out 語法僅有兩個參數,dbcoll,分別是要輸出的資料庫以及集合。

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'}
... ])

// 執行後查看,果然多出了 designer 集合
> show collections
designer
people
restaurants

// 確認數量也是 86 筆
> db.designer.count()
86

這樣就大功告成囉~
要切記,使用 db 語法必須是 4.4 版本後才支援

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。