mongodb基礎整理篇————常規操作[二]

敖毛毛發表於2022-01-09

前言

簡單整理一下常規操作。

正文

雖然一般說寫程式碼看的是思想,但是呢,如果不知道mongodb 有哪些常用的操作,那麼你怎麼能知道mongodb是否符合你的需求,比如說如果聚合功能都沒有,你得自己寫聚合,那麼這個工作量還是蠻大的,也不符合軟體開發。

插入一條資料:db.fruit.insertOne({'name':'apple'})

插入多個: db.fruit.insertMany([{'name':'apple1'},{'name':'apple2'}])

那麼find 有很多功能使用,比如說:

就是name 要等於apple。

那麼我們自然想到是否find 是否具有and 和 or 操作。

db.fruit.find({"name":"apple","number":10});

這種多個條件就是and了。

當然還可以這樣寫:db.fruit.find({$and:[{"name":"apple"},{"number":10}]});

查詢方式還支援正則表達。

同樣,那麼操作符怎麼寫呢?

(>) 大於 - $gt
(<) 小於 - $lt
(>=) 大於等於 - $gte
(<= ) 小於等於 - $lte

比如說數量要大於1:

還支援很多,比如說:

 $ne 不等於
 $exits 是否為空
 $in 查詢區間 {a:{$in:[1,2,3,4]}}
 $nin 不在查詢區間

mongo是有子文件的,那麼子文件該如何查詢,比如說:

db.fruit.insertOne({"name":"pear","number":100,"from":{
    "country":"china",
    "province":"jiangxi"
}})

裡面有條這樣的記錄。

那麼查詢的時候這樣寫:

那麼我能不能這樣寫呢:

似乎是不行的,但是又沒有報錯,那麼就產生疑問了,這種是幹什麼的?

我們知道: 是相等的意思,那麼這個意思就是from 要等於{"country":"china"}

試一下哈:

db.fruit.insertOne({"name":"pineapple","number":100,"from":{
    "country":"china"
}})

然後查一下:

這是有另外一個疑問,因為我們支援陣列的,那麼陣列裡面的東西怎麼查詢,例如:

db.fruit.insertMany([{"name":"colorApple","color":["red", "yellow"]
},{"name":"colorBanana","color":["red", "green"]}])

只需要用:即可。

還可以用$in:db.fruit.find({"color":{$in:["red"]}})

如果查沒有,那麼可以:db.fruit.find({"color":{$nin:["red"]}})

對此還是很方便的。

mongodb 陣列查詢還有一個注意的地方:

{
    "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"),
    "name" : "趙小明",
    "used_name" : [ 
        "趙明", 
        "趙小朋"
    ],
    "age" : 16,
    "gender" : 0,
    "relatives" : [ 
        {
            "name" : "趙剛",
            "relationship" : 0
        }, 
        {
            "name" : "秀英",
            "relationship" : 1
        }
    ]
}

比如說這條記錄:

db.people.find({
    "relatives.name": "趙剛", "relatives.relationship": 1
})

居然查出來了。需求是relatives.name 要是趙剛,relatives.relationship 必須是1,這兩個是and的關係。

在mongo中子文件的and,需要這樣寫:

db.people.find({
    "relatives":{ $elemMatch:{"name":"趙剛", "relationship": 1}}
})

上面可以看到我們返回的都是整條記錄,那麼只想要某個欄位呢?

db.people.find({
    "relatives":{ $elemMatch:{"name":"趙剛"}}
},{name:1})

這樣就是隻要name了。

那麼有沒有不要某個欄位其他都要呢?

db.people.find({
    "relatives":{ $elemMatch:{"name":"趙剛"}}
},{name:0})

這裡就除了name 其他都有。

那麼有了新增和查詢,那麼如何進行刪除呢?

首先有個非常危險的操作,那就是:db.fruit.remove({}),傳入一個空文件,那麼就會刪除全部的。

db.fruit.remove({"name":"apple"})

告訴我們刪除一條了。

db.fruit.updateOne({"name":"apple1"},{$set:{from:{country:"china"}}})

將這個改成china。

有updateOne 還有updateMany 從字面意思也知道,一個是更新一條一個是更新全部的。

有set 就有unset:

db.fruit.updateOne({"name":"colorApple"},{$unset:{color:"red"}})

如果color裡面有red,那麼就刪除掉。

那麼mongo更新的時候,對陣列還是特別的優待:

$push 增加一個物件到陣列底部
$pushAll 增加多個物件到資料底部
$pop 從陣列底部刪除一個物件
$pull 如果匹配指定的值, 從陣列中刪除相應的物件
$pullAll 如果匹配任意的值, 從資料中刪除相應的物件
$addToset 如果不存在則增加一個值到陣列

那麼如果刪除整個集合呢?

可以使用:

db.fruit.drop()

這個drop 會把索引都刪掉,而不僅僅是清空資料庫。

下一節聚合查詢

相關文章