MongoDB 創建,更新,刪除文檔 上


創建文檔

向MongoDB插入數據,使用insert,

如:db.refactor.insert({"refactor's blog":"http://www.cnblogs.com/refactor"})

這個操作會給 文檔 增加 一個"_id",鍵,並保存在數據庫中。

批量插入

如果要插入多個文檔,使用批量插入會快一些,批量化插入能傳入一個有文檔構成的數據給數據庫

一次批量插入只是單個的TCP請求,避免了許多零碎的請求帶來的開銷.由於無需處理大量的消息頭,

這樣能減少插入時間.每當單個文檔發送致數據庫時,會有一個頭部信息,告訴數據庫對指定的集合做

插入操作.用批量插入的話,數據庫就不用重復的處理每個文檔的這種頭部信息了.

當前版本MongoDB消息的最大長度是16M,使用批量插入是有這個限制的.

插入的原理和作用

當執行插入的時候,使用的驅動程序會將數據轉換成BSON的形式,然后將其送入數據庫.數據庫解析

BSON,檢驗是否包含"_id"鍵並且不超過16M,除此之外,不做別的驗證,就只是簡單的將文檔原樣的

存入數據庫.這樣做的壞處是允許插入無效的數據,好處是能讓數據庫更加安全,遠離注入式攻擊.

所有的主流語言的驅動會在傳送數據之前進行一些數據的有效性檢查(文檔是否超長,是否含非utf-8的字符,

是否使用了未知類型).同樣也可以啟動數據庫服務器的時候使用--objcheck選項,這樣服務器就會在插入

之前先檢驗文檔結構的有效性,當然這樣要犧牲性能.

查看doc文檔轉化為BSON的大小(以字節為單位),在shell中使用Object.bsonsize(doc)

 

刪除文檔

db.users.remove()

會刪除users集合的所有文檔,但不會刪除集合本身,原有的索引也會保留.

remove函數可以接受一個查詢文檔作為可選參數,給定這個參數,只有符合條件的文檔才會被刪除.

db.users.remove({"name":"Refactor"})

刪除數據的永久性的,不能撤銷和恢復.

如果要清除整個集合,直接刪除集合(然后重建索引)比刪除集合中所有的文檔要快.

刪除集合:db.drop_collection("users")

 

更新文檔

update有兩個參數,一個是查詢文檔,用來找出要更新的文檔,另一個是修改器文檔,描述對找到的文檔進行那些更改

更新的操作是原子性的,若兩個更新同時發生,先到服務器的先執行,然后執行另一個.最后的更新會顯示在數據庫

文檔替換

更新最簡單的就是使用一個新文檔來替代匹配的文檔,這適用於模式結構發生較大變化的時候.如將下面的文檔

{
  "name":"refactor",
  "friends":20,
  enemies:2
}

更改為

{
  "name":"refactor",
  "relationships":
  {
    "friends":20,
    enemies:2
  }
}

 

 使用修改器

通常文檔只會有一部分更新,利用原子的"更新修改器",更新修改器是特殊的鍵,用來指定復雜的更新操作,比如:

調整,增加,刪除鍵,操作數組,操作內嵌文檔.

一般網站都有計數器,來記數公有多少人訪問,可以使用原子修改器原子性的完成整個功能.如:

 

"$set"修改器入門

"$set"用來指定一個鍵的值,如果鍵不存在,則創建,這對更新模式或者增加用戶定義鍵來說很方便.

如:
db.users.insert(
  {
    "name":"refactor",
    "age":23,
    "sex":"male"
  }
)
添加喜歡的書籍:
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace"}
  }
)
db.users.findOne(
  {"name":"refactor"}
 )
修改喜歡的數據
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":"war and peace2"}
  }
)
"$set"可以修改鍵的數據類型,如果喜歡多本書,
將book鍵的值變為一個數組
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$set":{"book":["war and peace","war and peace2"]}
  }
)
使用"$unset"將鍵刪除,沒有要刪除的鍵也不報錯
db.users.update(
  {
    "name":"refactor"
  },
  {
    "$unset":{"book":1}
  }
)
使用"$set"修改內嵌文檔
db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

db.blog.update(
  {
    "author.name":"refactor"
  },
  {
    "$set":{"author.name":"refactor2"}
  }
)
db.blog.findOne(
  {
    "title":"refactor's blog"
  }
)
增加,修改,刪除鍵的時候,應該使用$修改器.一定要使用$開頭的修改器來修改鍵值對.

 

使用"$inc" 增加和減少

"$inc"用來增加已有鍵的值,若不存在鍵,則增加.用於分析數據,因果關系,投票或其他有變化值的地方.

如:

db.users.insert(
  {"url":"http://www.cnblogs.com/refactor"}
)

使用"$inc" 增加一個鍵pageViews,默認值為10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"給鍵pageViews,再增加10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":10000}}
)

使用"$inc"給鍵pageViews,再減少10000

db.users.update(
  {"url":"http://www.cnblogs.com/refactor"},
  {"$inc":{"pageViews":-10000}}
)

"$inc"和"$set"用法相似,用來增加或減少數字."$inc"只能用於整數,長整數或雙精度浮點數.

雖然很多語言能將 null,bool,有數字構成的字符串 轉化成 數字,但使用"$inc"仍會報錯:

"$inc"鍵的值也必須為數字.

 

數組修改器

"$push"和"$pop"只能用於數組.

如果指定的鍵已存在,"$push"會向已有的數組末尾加入一個元素,如果鍵不存在,就創建一個新數組.

如:

db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "author":
    {
      "name":"refactor",
      "email":"295240648@163.com"
    }
  }
)

向以上文檔中,添加一個包含一個數組的"comment"鍵,還向 comment 數組push一個評論.

這個數組會自動創建,並加入評論:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor2",
        "content":"nice"
      }
    }
  }
)

還想添加一條評論:

db.blog.update(
  {"title":"refactor's blog"},
  {
    $push:
    {
      "comments":
      {
        "name":"refactor3",
        "content":"good"
      }
    }
  }
)

如果一個值不在數組里就把它加進去.可以在查詢文檔時使用"$ne".

 

使用"$addToSet"

db.users.insert(
  {
    "userName":"refactor",
    "emails":
    [
      "295240648@163.com",
      "295240648@126.com"
    ]
  }
)

向emails添加新地址,用"$addToSet"避免重復

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@163.com"
    }
  }
)

這樣"295240648@163.com" 不會插入到emails中

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":"295240648@qq.com"
    }
  }
)

這樣"295240648@qq.com" 會插入到emails中 

 

將"$addToSet"和"$each"一起使用,可以添加不同的值.

db.users.update(
  {"userName":"refactor"},
  {
    "$addToSet":
    {
      "emails":
      {
        "$each":
        [
          "295240648@111.com",
          "295240648@112.com",
          "295240648@113.com"
        ]
      }
    }
  }
)

 

使用"$pop",可以從數組任何一端刪除元素.

{$pop:{key:1}}從數組末尾刪除一個元素
{$pop:{key:-1}}從數組頭部刪除一個元素

使用"$pull",可以根據特定條件刪除元素,也可以根據位置刪除元素

db.users.update(
  {"userName":"refactor"},
  {
    "$pull":
    {
      "emails":"295240648@111.com"
    }
  }
)

"$pull"會將所有匹配的部分刪掉,對於數組[1,1,2,1]執行pull 1,得到的結果數組是[2]


免責聲明!

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



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