MongoDB原生命令CURD

《MongoDB權威指南》學習摘錄php

Insert

使用insert方法

  • 該操做文檔會自動生成一個"_id"鍵python

>db.foo.insert({「bar」 : 「baz」})

批量插入,使用batchInsert函數

>db.foo.batchInsert([{ "_id" : 0 } , { "_id" : 1 } , { "_id" : 2 }])

當前mongodb能接受的最大消息長度是48MB,而且若是在執行批量插入過程當中有一個文檔插入失敗,則在該文檔以前的全部文檔都會成功插入到集合中,而這個文檔以後的全部文檔所有插入失敗。正則表達式

Remove

使用remove方法

//刪除foo集合的全部文檔
>db.foo.remove()

//刪除指定查詢文檔做爲可選參數
>db.mailing.list.remove( { 「opt-out」 : true } )

使用drop()比直接刪除集合會更快

>db.foo.drop()

Update

文檔替換

{
  "_id": ObjectId("..."),
  "name": "joe",
  "friends": 32,
  "enemies": 2
}

如今須要更新"friends"和"enemies"兩個字段到"relationships"子文檔中mongodb

>var joe = db.users.findOne({"name":joe});
>joe.relationships = {"friends":joe.friends,"enemies":joe.enemies};
{
  "friends":32,
  "enemies":2
}
>joe.username = joe.name;
"joe"
>delete joe.friends;
true
>delete joe.enemies;
true
>delete joe.name;
true
>db.users.update({"name":"joe"},joe);

更新後的文檔json

{
  "_id":ObjectId("..."),
  "username":"joe",
  "relationships":{
    "friends":32,
    "enemies":2
  }
}

常見的錯誤是查詢條件匹配到多個文檔,而後更新的時候回因爲第二個參數的存在就產生重複的"_id"值,對於這種狀況要使用"_id"值來進行查詢數組

使用修改器

  • "$inc"修改器使用bash

當有人訪問頁面的時候,就經過url找到該頁面,而後使用"$inc"修改器增長"pagerviews"的值函數

{
  "_id":ObjectId("..."),
  "url":"www.lgybetter.com",
  "pagerviews":52
}
>db.analytics.update({"url":"www.lgybetter.com"},{"$inc" : {"pagerviews" : 1}})

注意,使用修改器時,"_id"並不會改變,而文檔替換過則會post

  • "$set"修改器使用學習

>db.user.update({"_id":ObjectId(...)},{"$set" : {"favorite book" : "War and Peace"}})

因而更新後的文檔就有了"favorite book"鍵,若是要繼續修改則:

>db.user.update({"_id":ObjectId(...)},{"$set" : {"favorite book" : "Green Eggs and Ham"}})

也能夠變爲數組的類型

  • 使用"$unset"能夠將這個鍵徹底刪除:

>db.user.update({"name":joe},{"$unset" : {"favorite book" : 1}})
  • "$push"修改器使用

    若是數組存在,"$push"會向已有的數組的末尾加入一個元素,若是沒有改數組就建立一個新的數組

{
  "_id":ObjectId("..."),
  "title":"A blog post",
  "content":"..."
}
>db.blogs.posts.update({"title" : "A blog post"},{"$push" : {
    "comments" : {"name" : "joe","email" : "joe@example.com","content":"nice post."}
}})
>db.blog.posts.findOne()
{
  "_id":ObjectId("..."),
  "title":"A blog post",
  "content":"...",
  "comments": [
    {
      "name":"joe",
      "email":"joe@example.com",
      "content":"nice post"
    }
  ]
}

注意,"$push"會建立一個數組的類型,可用於動態添加數據

  • 用"$push"一次添加多個數據,配合使用"$each"

>db.stock.ticker.update({"_id":"GOOG"},{
  "$push" : {"hourly" : { "$each" : [
    562.776,562.790,559.123
  ]}}
})
  • 使用"$slice"來固定數組的最大長度

>db.movies.find({"genre" : "horror"},{
  "$push" : { "top10" : {
      "$each" : ["Nightmare on Elm Street" , "Saw"],
      "$slice" : -10,
      "$sort" : {"rating" : -1}
    }
  }
})

注意,"$slice"的值應該是負整數,"$sort"能夠用來對數組中的全部對象進行排序,不能只將"$slice"或者"$sort"與"$push"配合使用,且必須使用"$each"。

  • 使用"$ne",使得數組變爲數據集合

>db.paper.update({"authors cited" : {"$ne" : "Richie"},
  {"$push" : {"authors cited" : "Richie"}}
})
  • "$addToSet"和"$each"組合使用,效果是與"$ne"同樣,可是能夠用來同時插入多條數據

>db.users.update({"_id" : ObjectId("...")}, {"$addToSet" :
  {"emails" : {"$each" :
    ["joe@php.net","joe@example.com","joe@python.org"]
  }}
})
  • 使用"$pop"刪除數組元素{"$pop" : {"key" : 1}}從數組末尾刪除,{"$pop" : {"key" : -1}}從數組頭部刪除

  • 使用"$pull"刪除元素

>db.lists.update({},{"$pull" : {"todo" : "laundry"}})

使用upsert

upsert是一種特殊的更新,要是沒有找到符合更新條件的文檔,就會以這個條件和更新
文檔爲基礎建立一個新的文檔。

>db.analytics.update({"url" : "/blog"} , {"$inc" : {"pageviews" : 1}} ,true)
  • 有時候,須要在建立文檔的同時建立字段併爲它賦值,可是在以後的全部更新操做中,該字段的值就再也不改變。這時候就使用"$setOnInsert"

>db.users.update({} , {"$setOnInsert" : {"createdAt" new Date()}},true)

更新多個文檔

具體的操做值經過:

>db.runCommand({getLastError:1})

返回結果

{
  "err":null,
  "updatedExisting":true,
  "n":5,
  "ok":true
}

Find

find入門操做

  • 查詢該集合下的全部文檔

>db.c.find()
  • 查詢特定值的文檔,能夠同時添加多個條件

>db.users.find({"age" : 20})
>db.users.find({"age" : 20 , "name" : "lgy"})
//指定須要返回的鍵
>db.users.find({} , {"username" : 1,"email" : 1})
//返回結果
{
  "_id":ObjectId("..."),
  "username":"lgy",
  "email":"lgy@example.com"
}
  • 經過查詢,默認狀況下回返回"_id"這個鍵,若是但願不出現其餘的鍵值,就使用以下:

>db.users.find({},{"username" : 1,"_id" : 0})
//返回結果
{
    "username":"lgy"
}

查詢條件

  • 查詢條件:

"$lt","$lte","$gt","$gte"就是所有的比較操做符,分別對應<,<=,>,>=

//查詢18 ~ 30歲的用戶:
>db.users.find({"age" : {"$gte" : 18 , "$lte" : 30}})

"$ne"表示不等於某個特定的值

//查詢用戶名不爲"lgy"的全部用戶
>db.users.find({"username" : {"$ne" : "lgy"}})
  • OR查詢:

"$in" 和 "$or"兩種方式進行OR查詢

>db.raffle.find({"ticket_no" : {"$in" : [725,542,390]}})

"$nin"是與"$in"相反的

>db.raffle.find({"$or" : [{"ticket_no" : 725},{"winner" : true}]})
  • 二者結合使用:

>db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725,542,300]}},{"winner" : true}]})

$not

"$not"是元條件句,便可以在任何其餘條件之上。

"$mod"經過傳入兩個參數,第一個用來做爲除數,第二個是用來斷定餘數是否爲此數字
>db.user.find({"id_num" : {"$not" : {"$mod" : [5,1]}}})

特定類型的查詢

  • null

null不只會匹配某個鍵的值爲null的文檔,並且還匹配不包含這個鍵的文檔

>db.c.find({"z" : null})

若是僅僅想匹配鍵值爲null的文檔,則能夠加"$exists"條件:

>db.c.find({"z" : {"$in" : [null], "$exists" : true}})
  • 正則表達式

>db.users.find({"name" : /joey?/i})
  • 查詢數組

$all,能夠用來進行多個元素匹配數組

//這樣查找就能夠匹配到同時存在的兩個元素的文檔
>db.food.find({"fruit" : {"$all" : ["people","banana"]}})

$size用來查詢特定長度的數組

>db.food.find({"furit" : {"$size" : 3}})

$slice用來返回某個匹配數組元素的一個子集

//返回前十條評論,若是把10換成-10就是返回後十條評論
>db.blog.posts.findOne(criteria,{"comments" : {"$slice" : 10}})

//這個操做會跳過前面23個元素,返回第24~33個元素
>db.blog.posts.findOne(criteria,{"comments" : {"$slice" : [23,10]}})

返回一個匹配的數組元素

>db.blog.find({"comments.name" : "bob"}, {"comments.$" : 1})
//返回結果
{
  "id" : ObjectId("..."),
  "comments" : [
    {
      "name" : "bob",
      "email" : "bob@example.com",
      "content" : "good post"
    }
  ]
}
//這樣就只會返回第一條評論
  • 查詢內嵌文檔

如今有這樣的數據

{
  "name": {
    "first":"joe",
    "last":"Schmoe"
  },
  "age":45
}

對內嵌文檔的查詢

//用點表示法表達"進入內嵌文檔內部"的意思
>db.people.find({"name.first" : "joe" ,"name.last" : "Schmoe"})

要正確指定一組條件,而沒必要指定每一個鍵,就須要使用"$elematch"

>db.blog.find({"comments" : {$elematch" : {"author" : "joe", "score" : {"$gte" : 5}}}})

遊標

  • 遊標查詢的具體操做:

>for(i = 0; i <100; i ++) {
  db.collection.insert({x : i});
}

>var cursor = db.collection.find();

>while(cursor.hasNext()) {
  obj = cursor.next();
  //輸出查看
}

###limit,skip,和sort

    >db.c.find().limit(3)


    >db.c.find().skip(3)
相關文章
相關標籤/搜索