在前兩篇文章裡介紹了在 MongoDB 中執行 CRUD 操作的指令及方法,今天更進一步和大家介紹 MongoDB 中的 document 及如何對較複雜的 embedded document 進行過濾。
在這之前我們所看到的 document 內容都是每個 field 對應一個 value 值,而在實際狀況裡,我們可能會在一個 field 欄位儲存超過一個 value,而這時候 document 的資料結構就會變得較為複雜。
例如之前範例中 employee 這個 collection 的每個職員 document 中只有 "first_name", "last_name", "title", "salary" 及 "hire_date" 5 個 filed 欄位,且每個 field 都只對應一個 value,如果我們要在職員資料中增加 hobby 和 contact 兩個欄位,且這兩個欄位存的值都超過一個:
[
{
"first_name": "Robin",
"last_name": "Jackman",
"title": "Software Engineer",
"salary": 5500,
"hire_date": "2001-10-12",
"hobby": ["book", "movie"],
"contact": {
"email": "rj@jackman.com",
"phone": 1111
}
},
{
"first_name": "Taylor",
"last_name": "Edward",
"title": "Software Architect",
"salary": 7200,
"hire_date": "2002-09-21",
"hobby": ["travel", "hiking"],
"contact": {
"email": "te@edward.com",
"phone": 2222
}
},
{
"first_name": "Vivian",
"last_name": "Dickens",
"title": "Database Administrator",
"salary": 6000,
"hire_date": "2012-08-29",
"hobby": ["travel", "music"],
"contact": {
"email": "vd@dickens.com",
"phone": 3333
}
},
{
"first_name": "Harry",
"last_name": "Clifford",
"title": "Database Administrator",
"salary": 6800,
"hire_date": "2015-12-10",
"hobby": ["book", "gym"],
"contact": {
"email": "hc@clifford.com",
"phone": 4444
}
}
]
我們可以發現, hobby 對應的 value 是由多個 string 組成的 array,而 contact 對應的 value 則是由多組 field-value 組成的集合。
在這樣複雜的嵌入式文件中,如果要以 "first_name" 來過濾,則可以簡單透過 db.employee.findOne({"first_name": "Robin"})
來進行查詢。但如果想要對 hobby 或是 contact 這種複雜結構的 field 進行過濾,以下會介紹要如何對複雜結構的 document 進行過濾查詢。
之前對簡單結構的 document 進行過濾時,過濾條件的 filter 不需要使用 "" 也可以正確執行,但對於嵌入式文件的複雜結構進行過濾查詢時,""就不能省略,例如我們要查詢聯絡資訊的電話是 1111 的職員,需要使用以下指令:db.employee.findOne({"contact.phone":1111})
若我們想要查詢 hobby 是 book 的職員,則需要使用以下指令:db.employee.find({hobby:"book"}).pretty()
如果我們想要查詢 hobby 同時有 book 和 movie 的職員,則要使用以下指令:db.employee.find({hobby:["book", "movie"]}).pretty()
我們也可以使用 $in 這個運算符號來做查詢
指令:{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }
db.employee.find({hobby:{$in: ["book", "movie"]}}).pretty()
今天介紹了 MongoDB 中 embedded document 的概念及查詢過濾的方法,對細節有興趣的朋友可以查詢官方文件的介紹。