mongo出識以及對數組的操做

若是你尚未安裝,能夠參考下這個文章,mondodb基本安裝和curdphp

首先推薦個工具,no-sql-manager-for-mongodb-professional,雖然收費,可是每月能夠從新註冊。 無限次使用下載html

插入兩條數據java

use demo
db.demo.insert({name:2})
db.demo.insert({name:3})

更新name爲4不存在的數據,對數據沒有任何影響
db.demo.update({name:4},{age:4})node

update第三個參數加true表示對更新不存在數據時候自動添加這條數據,可是下面的語句是把name幹掉了,只剩下age字段,由於沒有$set操做符python

db.demo.update({name:3},{age:3},true)mysql

請本身比較下面兩區別
db.demo.update({name:99},{$set:{age:213}},true)
db.demo.update({name:99},{age:213},true)jquery

如今數據以下git

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3 }

讓3歲孩子上小學
db.demo.update({age:3},{$set:{school:1}})github

這樣age=3的其中一個就有學上了redis

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3, "school" : 1 }

可是想要全部的3歲孩子上小學,須要第四個參數爲true第三個參數false表明若是不存在,沒必要插入新的數據,另外由於第四個參數是true,表明批量更新

db.demo.update({age:3},{$set:{school:1}},false,true)

複習:請本身比較如下兩條代碼

db.demo.update({age:3},{$set:{school:1}},false,true)
db.demo.update({age:4},{$set:{school:2}},true,true)

咱們在加一個四歲的孩子,直接給他學上,即便沒有四歲的孩子也要造一個讓他上小學二年級,由於第三個參數是true

db.demo.update({age:4},{$set:{school:2}},true,true)

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3, "school" : 1 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3, "school" : 1 }
{ "_id" : ObjectId("561f8b066adf558520f65efd"), "age" : 4, "school" : 2 }

四歲孩子本身長大了,長大了一歲,$inc,對字段遞增

db.demo.update({age:4},{$inc:{age:1}},true,true)

學校也要長大一級,上3年級了,想蹦極就直接school:2

db.demo.update({age:5},{$inc:{school:1}})

{ "_id" : ObjectId("561f890aa5688363f84bf0bb"), "name" : 2 }
{ "_id" : ObjectId("561f88f5a5688363f84bf0ba"), "age" : 3, "name" : 3, "school" : 1 }
{ "_id" : ObjectId("561f89486adf558520f65efc"), "age" : 3, "school" : 1 }
{ "_id" : ObjectId("561f8b066adf558520f65efd"), "age" : 5, "school" : 3 }

刪除一些沒用的屬性 $unset,本身測試-1和1都行。
db.demo.update({name:99},{$unset:{age:-1}})


熱身完畢,數組時間到。這是mongo的獨特之處哦
添加個id爲5的人,名字爲5,給他個喜歡的空書單

db.demo.insert({_id:5,name:5,books:[]})

db.demo.find()
{ "_id" : 5, "name" : 5, "books" : [ ] }

增長一個或者多個元素,給他本myaql看

db.demo.update({_id:5},{$push:{books:"php,mysql"}})

在來一個愛好,反正不要錢

db.demo.update({_id:5},{$push:{habbit:"song,girl,box"}})

{ "_id" : 5,
"name" : 5,
"books" : [ "php,mysql"],
"habbit" : [ "song,movie,girl"]
}

想往數組添加又怕重複,就用$addToSet

db.demo.update({_id:5},{$addToSet:{books:"js,sql"}})

無論上面執行多少次,結果都是

{ "_id" : 5, "name" : 5, "books" : [ "php,mysql", "js,sql" ] }

我想一條語句批量向books添加(node.js,mongo,redis),就這樣

db.demo.update({_id:5},{$addToSet:{books:{$each:["node.js",'mongo','redis']}}})

刪除一條記錄remove
db.demo.remove({_id:5})

咱們看數組中的刪除操做:假如如今結果這樣,咱們來試試刪除數組元素
{ "_id" : 5, "books" : [ "js", "js,sql", "mongo", "java" ] }

-1表明第一個元素,1表明最後一個元素,本身動手敲吧,孰能生氣襖~

db.demo.update({_id:5},{$pop:{books:-1}})
db.demo.update({_id:5},{$pop:{books:1}}) 
db.demo.update({_id:5},{$pull:{books:"PHP"}})// 用pull 刪除指定一個元素
db.demo.update({_id:5},{$pullAll:{books:["js,sql","mongo"]}})// pullAll刪除多個元素,注意參數爲數組

獲取最後錯誤(執行狀況)
db.runCommand({getLastError:1})

用find的第二個參數返回只想要的字段,只是查詢name字段,0爲相反(剔除某個字段,_id也一樣試用)
db.demo.find({},{name:1)}
查詢條件 $lt,$lte,$gt,$gte,$ne,$ne,$in,$nin,$or,$mod,$not,
查找複合特定要求
db.demo.find({name:"u_2"})

建立一個不存在數組字段,默認爲空
db.demo.update({name:"u_2"},{$set:{'books':[]}},true)

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("563abcde3d94d7df4f645c92")
})

db.demo.find({name:'u_2'})
{ "_id" : ObjectId("563abcde3d94d7df4f645c92"), "name" : "u_2", "books" : [ ] }

向books數組裏裏添加元素 php
db.demo.update({name:"u_2"},{$addToSet:{books:"php"}})

向books批量添加元素並且不會重複添加
db.demo.update({name:"u_2"},{$addToSet:{books:{$each:["node","python","php"]}}})

在數組中添加一個元素能夠在加一個重複的php,這樣裏面就有兩個php了

db.demo.update({name:"u_2"},{$push:{books:"php"}})

建立一個不存在的數組,並且給他自定義初始值
db.demo.update({name:"u_2"},{$addToSet:{todo:{$each:["l","m","n"]}}})

刪除todo數組中的尾部 n
db.demo.update({name:"u_2"},{$pop:{todo:1}})

刪除todo數組中的頭部 l,如今就todo裏就剩下n了
db.demo.update({name:"u_2"},{$pop:{todo:-1}})

再加些數據,用push和each能夠批量添加並且能夠重複,如今todo裏是有m,l,m,n四個字段
db.demo.update({name:"u_2"},{$push:{todo:{$each:["l","m","n"]}}})

刪除指定的數組某個元素,咱們就刪除最後一個,爲n的,如今剩下了mlm三個

db.demo.update({name:"u_2"},{$pull:{todo:"n"}})

更新todo裏m的值,爲mm,只是更新了第一條匹配到的

db.demo.update({name:"u_2",todo:"m"},{"$set":{"todo.$":"mm"}})

這種也能夠,注意要加雙引號

db.demo.update({name:"u_2"},{$set:{"todo.1":"www"}})

數組的其餘查找 $all,$size,


咱們在來一條新的記錄,建立一條新的記錄_id爲6:

db.demo.insert({_id:6,name:'tb',books:[{type:"js",name:"extjs4.0",author:"tom"},{type:"db",name:"mongo"}]})

再更新下,多加一條

db.demo.update({_id:6},{$set:{books:[{type:"js",name:"extjs4.0",author:"tom"},{type:"db",name:"mongo"},{type:"js",name:"jquery"}]}})

db.demo.find({_id:6}).pretty()
{
    "_id" : 6,
    "name" : "tb",
    "books" : [
        {
            "type" : "js",
            "name" : "extjs4.0",
            "author" : "tom"
        },
        {
            "type" : "db",
            "name" : "mongo"
        },
        {
            "type" : "js",
            "name" : "jquery"
        }
    ]
}

爲type是js的books元素添加pens:"too long"屬性,使用.符號必定使用雙引號引用,用$佔位

db.demo.update({"books.type":"js"},{$set:{"books.$.pens":"too long"}})//增長數組內集合一個新元素,若是"books.type"沒有加雙引號,會報語法.號錯誤
{ "_id" : 6, "name":"tb",books" : [ { "type" : "js", "name" : "extjs4.0", "author" : "tom", "pens" : "too long" }, { "type" : "db", "name" : "mongo" }, { "type" : "js", "name" : "jquery" } ] }

db.demo.update({"books.type":"js"},{$set:{"books.$.author":"tb"}})//更改數據內一個集合新元素,把book裏type爲js的author改成tb

{ "_id" : 6, "name":"tb","books" : [ { "type" : "js", "name" : "extjs4.0", "author" : "tb", "pens" : "too long" }, { "type" : "db", "name" : "mongo" }, { "type" : "js", "name" : "jquery" } ] }


其餘的小操做:

db.demo.find({},{books:0)// 返回除去books之外的全部鍵值對。1爲只返回books的鍵值對
db.demo.find({age:{"$gte":30,"$lte":40}})//仍是要加雙引號哦
db.demo.find({"age":{"$ne":1}})// 不等於$ne
db.demo.find({"age":{"$in":[30,2,3,4,5,69]}})//相似於mysql in操做
db.demo.find({"age":{"$in":[1,2,3,4,5,6]}}).forEach(function(doc){
    printjson(doc)
})

db.version() 查看版本
db.getMongo () 查看當前機器鏈接地址
如:若是你想建立一個「myTest」的數據庫,先運行
use myTest
命令,以後就作一些操做(如:
db.createCollection('user')
,這樣就能夠建立一個名叫「myTest」的數據庫。
從指定主機上克隆數據庫

db.cloneDatabase("127.0.0.1"); 將指定機器上的數據庫的數據克隆到當前數據庫

從指定的機器上覆制指定數據庫數據到某個數據庫

db.copyDatabase("mydb", "temp", "127.0.0.1");將本機的mydb的數據複製到temp數據庫中

修復當前數據庫

db.repairDatabase();
刪除全部
db.demo.remove({})

其餘基本命令從這裏找

相關文章
相關標籤/搜索