標籤:
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:"[email protected]" }}
--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:
$set
$unset
MongoDB 如何查詢和修改內嵌文檔