【MongoDB】基本命令

1.插入文档:insert

语法:db.collection_name.insert({<key1>:<value1>,<key2>:<value2>...})

1.1 插入一条文档

> use fruitsdb # 数据库存在则连接,不存在,则新建;
switched to db fruitsdb
> db.fruitsInfo.insert({"name":"apple",price:10}) // 插入
WriteResult({ "nInserted" : 1 }) 
> db.fruitsInfo.find() // 查询集合信息
{ "_id" : ObjectId("5e45649f34694e662cebe073"), "name" : "apple", "price" : 10 }
> 

(1) 此处的db为数据库名,如果在程序中往数据库插入值的话,则应该写成:fruitsdb.fruitsInfo.insert({"name":"apple",price:10})

(2) insert命令,会自动产生一个ID

(3) insert命令可以使用save命令代替。若使用save命令指定_id值,则会更新默认的_id值

> db.fruitsInfo.save({_id:9999,"name":"orange",price:8})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 9999 })

> db.fruitsInfo.find()
{ "_id" : 9999, "name" : "orange", "price" : 8 } // _id已经被自定义

1.2 插入多条文档(无序)

db.fruitsInfo.insert(
    [
        {
            "name":"watermelon",price:3
        },
        {
            "name":"strawberry",price:20
        },
        {
            "name":"peach",price:8
        }
    ]
)

注意:使用insert命令一次性插入多条文档会比一条一条的插入省时,效率较高。

1.3 插入多条文档(有序)

此处的有序是从上往下顺序执行的意思

db.fruitsInfo.insert(
    [
        {
            _id:1,"name":"watermelon",price:3
        },
        {
            _id:2,"name":"strawberry",price:20
        },
        {
            _id:3,"name":"peach",price:8
        }
    ],
    {ordered:true} // true表示出错,则命令执行失败。false表示,如果其中有一条记录出错,则除了出错记录外,其他记录继续插入
)

1.4 特殊的插入:insertOne与insertMany

-- 此语句插入会报错
db.goodsInfo.insertOne(
    [
        {_id:120,"name":"三国演义",price:89},
        {_id:121,"name":"红楼梦",price:89} 
    ]
)

---支持多条插入
db.goodsInfo.insertMany(
    [
        {_id:114,"name":"三国演义",price:89},
        {_id:115,"name":"红楼梦",price:89} 
    ]
)

insertOne可以确保只插入一条文档,不允许做多文档操作。insertMany则反之。

2.查询文档:find

语法:db.collection_name.find()

2.1 简单查询:db.collection_name.find()

db.collection_name.find() # collection_name为集合名字

2.2 条件查询

# 单条件查询
db.goodsInfo.find(
    {"name":"三国演义"} // 此为查询条件
)

# 查询需要的字段
db.goodsInfo.find(
    {"name":"三国演义"} ,
        {_id:0} //此处的0或者false表示不显示字段,1或者true表示显示字段
)

2.3 查询null或不存在的字段

// 插入
db.studentInfo.insert(
    [
        {
            _id:110,name:"Jack"
        },
        {
            _id:111,name:"Lucy"
        },
        {
            _id:112,name:null
        },
        {
            _id:113
        }
    ]
)
// 查询
db.studentInfo.find(
    {
        name:null
    }
)
//------------输出结果------------
{ "_id" : 112, "name" : null }
{ "_id" : 113 }


// 查找的值不存在
db.studentInfo.find(
    {
        name:{$exists:false}
    }
)
//------------输出结果------------
{ "_id" : 113 }

2.4 limit与skip方法

db.studentInfo.find().limit(2) // 返回前2行记录
db.studentInfo.find().skip(2) // 跳过前2行,从第3行开始显示

2.5 $in运算符的查询

db.studentInfo.find(
    {
        _id:{
            $in:[110,111]   // 查找_id等于110与111的文档
        }
    }
)

2.6 find()查询条件操作符及实例

操作符 格式 实例 与TRDB的对比
小于 { :{$lt: }} db.studentInfo.find({age:{$lt:19}}) where age<19
小于等于 { :{$lte: }} db.studentInfo.find({age:{$lte:19}}) where age<=19
大于 { :{$gt: }} db.studentInfo.find({age:{$gt:19}}) where age>19
大于等于 { :{$gte: }} db.studentInfo.find({age:{$gte:19}}) where age>=19
不等于 { :{$ne: }} db.studentInfo.find({age:{$ne:19}}) where age!=19
and { : , : ...} db.studentInfo.find({age:18,name:"Jack"}) where age=18 and age='Jack'
or {$or:[{ : },{ : },...]} db.studentInfo.find({$or:[{_id:110},{_id:111}]})
模糊匹配:匹配尾部 { :{$regex:/ $/}} db.studentInfo.find({name:{$regex:/ck$/}}) where name like '%ck'
模糊匹配:匹配头部 { :{$regex:/^ /}} db.studentInfo.find({name:{$regex:/^Ja/}}) where name like 'Ja%'
模糊匹配:匹配任意部分 { :{$regex:/ /}} db.studentInfo.find({name:{$regex:/Ja/}}) where name like '%Ja%'

2.7 区间查询

// 查询年龄大于17小于19岁的文档
db.studentInfo.find(
    {
        age:{$gt:17,$lt:19}
    }
)

3.更新文档:update

语法:db.collection_name.update()

3.1 简单修改:$set

// 插入测试文档
db.bookInfo.insert(
    {
        title:"武侠小说",
        total:23,
        detail:[
        {name:"神雕侠侣",score:9.2,hitCount:888888},
        {name:"笑傲江湖",score:8.8,hitCount:999999},
        {name:"碧血剑",score:8.9,hitCount:1111111}
        ]
    }
)
// 更新title
db.bookInfo.update(
    {
        title:"武侠小说"
    },
    {
        $set:{title:"好看的武侠小说"}
    }
)

3.2 更新数值(加法):$inc

使用$inc更新数值,做的是加法运算。以下更新语句,更新后total的值为46

db.bookInfo.update(
    {
        title:"好看的武侠小说"
    },
    {
        $inc:{total:23}
    }
)

3.3 更新数值(乘法):$mul

使用$mul更新数值,做的是乘法运算。以下更新语句,更新后total的值为92

db.bookInfo.update(
    {
        title:"好看的武侠小说"
    },
    {
        $mul:{total:2}
    }
)

3.4 修改字段名:$rename

// 修改字段名,将total修改为sum
db.bookInfo.update(
    {
        title:"好看的武侠小说"
    },
    {
        $rename:{"total":"sum"}
    }
)

3.5 根据最小值更新:$min

将$min给出的值与当前文档字段值进行比较,当给定值较小时,则修改当前文档值为给定值

db.bookInfo.update(
    {
        title:"好看的武侠小说"
    },
    {
        $min:{total:2}
    }
)

3.6 根据最小值更新:$max

将$max给出的值与当前文档字段值进行比较,当给定值较大时,则修改当前文档值为给定值

db.bookInfo.update(
    {
        title:"好看的武侠小说"
    },
    {
        $max:{total:12}
    }
)

3.7 删除字段:$unset


// 删除字段,删除sum字段
db.bookInfo.update(
    {
        title:"好看的武侠小说"
    },
    {
        $unset:{sum:92}
    }
)

3.8 修改一条文档里的数组和嵌套文档

// 插入文档数据
db.bookInfo.insert(
    {
        _id:100,
        title:"书单1",
        amount:120,
        unit:"RMB",
        detail:[
            {name:"西游记",price:98},
            {name:"三国演义",price:120}
        ],
        overview:{shopName:"当当网",shopNum:37}
    }
)
// 更新数据
db.bookInfo.update(
    {
        _id:100
    },
    {
        $set:{
            "detail.0":{name:"红楼梦",price:130}, // 更新detail数组的第一个元素
            "overview.shopName":"京东商城" // 更新嵌套文档
        }
        
    }
)

注意:引用嵌套文档对象或数组的时候,需要加""号,如:"detail.0","overview.shopName"

3.8 多文档修改:multi

// 插入多文档
db.custInfo.insert(
    [
        {name:"张三",age:18,address:"China"},
        {name:"李四",age:19,address:"China"},
        {name:"王五",age:17,address:"China"},
        {name:"Jack",age:16,address:"America"},
        {name:"Tom",age:12,address:"America"}
    ]
)
// 更新address为China的记录,将值修改为:云南

// 不添加参数multi,只会更新一条文档
db.custInfo.update(
        {address:"China"},{$set:{address:"云南"}}
)
// 添加参数multi,更新多条文档
db.custInfo.update(
        {address:"China"},{$set:{address:"云南"}},{multi:true}
)

3.9 简化修改命令:updateOne(),updateMany(),replaceOne()

updateOne():修改一条文档,与update()的区别是少了multi: 选项
updateMany():修改多条文档,与update()的区别是少了multi: 选项
replaceOne():与update()的区别是有2处,一是没有multi: 选项,二是在第二个参数没有更新操作

// replaceOne 操作案例(谨慎使用)
db.custInfo.replaceOne(
    {
        name:"李四"
    },
    {
        age:56
    }
)

注意:使用replaceOne对文档进行操作的时候,如果类似上述操作,则会直接将原有文档除_id外的字段全部替换给定字段,具体案例如下图:

4.删除文档:remove

4.1 删除文档中所有记录:db.collection_name.remove()

// 插入数据
db.custInfo.insertMany(
    [
        {name:"Jack",age:18},
        {name:"Marry",age:19}
    ]
)
// 删除
db.custInfo.remove({})

若要删除整个集合,可以使用db.custInfo.drop()删除,此方法效率更高,并且会把整个集合和索引一起删除。

4.2 删除符合条件的记录

// 插入数据
db.custInfo.insertMany(
    [
        {name:"Jack",age:18},
        {name:"Marry",age:19}
    ]
)
// 删除
db.custInfo.remove({age:{$gt:18}})

如果需要删除满足条件的单条记录,则添加justOne选项,案例如下:

// 插入数据
db.custInfo.insertMany(
    [
        {name:"Jack",age:18},
        {name:"Marry",age:19},
        {name:"Marry",age:20}
    ]
)
// 删除
db.custInfo.remove(
    {age:{$gt:18}},
    {justOne:true}
)

猜你喜欢

转载自www.cnblogs.com/OliverQin/p/12305885.html