MongoDB 內嵌文檔


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:

$set

$unset

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM