MongoDB是文檔型的數據庫系統,doc是MongoDB的數據單位,每個doc相當於關系型數據庫的數據行(row),doc和row的區別在於field的原子性:row中的column是不和分割的原子對象,而doc中的field可以是原子對象,也可以是內嵌doc(embedded doc),數組等數據類型。內嵌doc中所有field的Key不允許重復。
例如以下doc,contact 字段是內嵌doc。
oneDoc= { name:"t1", age:21, contact: { phone:123, email:"xx@microsoft.com" } }
--Insert a doc
db.foo.insert(OneDoc)
一,查詢內嵌文檔
1,如果內嵌doc存在field滿足query filter,那么將doc返回。在引用內嵌doc中的field時,使用 dot notation,格式是:embedded_doc.field:value,如果內嵌doc的field也是內嵌文檔,依次類推,embedded_doc1.embedded_doc2.field:value。
示例,查詢contact 字段中phone是123的所有doc。
db.foo.find({"contact.phone":123})
2,限制返回的doc的field
示例,使用find的第二個參數Projection doc,只返回兩個field:name 字段和內嵌doc的email字段。通過dot notation,將內嵌doc中的某些字段返回,格式是:embedded_doc.field:1,表示返回該字段,embedded_doc.field:0,表示不返回該字段。
db.foo.find({"contact.phone":123},{_id:0,"contact.email":1,name:1})
二,修改內嵌doc
upsert 選項非常有用,如果當前的doc中不存在內嵌文檔,通過$set modifier 來增加;如果當前的doc中存在內嵌文檔,通過$set modifier來修改內嵌文檔的值。
1,修改doc,增加內嵌doc
示例,增加address字段,這是內嵌doc
db.foo.updateMany( {name:"t1"}, {$set:{address:{province:"henan",city:"xinyang"}}}, {upsert:true} )
2,修改內嵌doc中的字段
示例,修改內嵌doc中province 和 city 字段的內容,全部修改為"shanghai"
db.foo.updateMany( {name:"t1"}, {$set:{address:{province:"shanghai",city:"shanghai"}}}, {upsert:true} )
三,刪除doc中的內嵌doc
$unset modifier能夠刪除doc中的字段,使用格式:{$unset:{field1:"", field2:""}},將刪除的字段放在$unset文檔中。
1,如果要刪除內嵌doc中的field或數組中的元素,可以使用dot notation。
示例,刪除address內嵌doc中的province 字段
db.foo.updateMany( {name:"t1"}, {$unset:{"address.province":""}}, {upsert:true} )
2,如果不使用dot notation,那么刪除的將是整個內嵌doc
示例,在$unset modifier中,使用address 內嵌doc 格式,那么將刪除address field。
db.foo.updateMany( {name:"t1"}, {$unset:{address:{province:"shanghai"}}}, {upsert:true} )
引用doc: