mongoDB使用笔记(一)-基本操作
mongoDB是一个文档型数据库,支持各种增删改查操作。其命令形式与OO更为类似,语句形式为“database.collection.operation({argc})”。作为文档型数据库,mongoDB不需要提前初始化数据库和文档集,在第一个操作时会自动初始化。
增
支持insertOne
和insertMany
两种操作,前者直接按JSON格式插入一个文档作为argc
,后者插入一个文档数组[doc1,doc2...]
,注意,数组中可以只有一个元素。
db.test.insertOne({
name: "Joe",
gender: "m"
})
db.test.insertMany([
{
name: "Jason",
birthdate: { "day": 3, "month": 3, "year": 1996 },
hobby: ["basketball", "running", "traveling"]
},
{
name: "Jason",
birthdate: { "day": 3, "month": 3, "year": 1996 },
hobby: ["basketball", "running", "traveling"]
}
])
查
同样支持两个操作findOne
和find
,后者返回全部符合条件的文档
find
包含两个变量,第一个限定查找范围,第二个限定返回值;只输入一个变量则返回符合的文档的全部内容,不输入变量则返回全部文档的全部内容
精确查找
第一个变量同样是JSON文档的格式,若输入普通的JSON文档,返回对应变量匹配的文档(不限制未提及的键值)
// 返回全部gender属性为f的文档
db.student.find({ gender: "f" })
// 如果是多级文档,采用类似类的写法,并用引号括起来。一个比较好的习惯是,键值也保持用引号括起来
db.student.find({ "birthdate.year": 1998 })
// 数组的写法也是类似的,以下返回time的第一个元素为9的文档
db.student.find({"time.0":9})
// 如果写成多级文档的形式,则会显示完全符合的文档,以下语句不会返回birthdate中包含其他属性,且year=1998的文档
db.student.find({ birthdate: {year: 1998 }})
条件查找
mongoDB支持多种条件查找的方法,其保留字统一以$
为标识,具体命令与latex语法类似。条件间采用大括号标明层次。
限定范围
对数字,可以使用$lt,$gt,$gte,$lte
限定上下界
// 返回age小于24的文档
db.student.find({age : { $lt: 24 } })
// 返回数组中有元素小于9且有元素大于18的文档
db.student.find( { time: { $lt: 9, $gt: 18} } )
对普通的属性,可以使用$in,$all
表明范围,前者是属性被列出的数组包含,后者是属性数组中包含列出数组
// 返回city为下列之一的文档
db.student.find({ city: { $in: ["Shanghai", "Hangzhou", "Chengdu"] } })
// 返回hobby包含下列的文档
db.student.find( { hobby: { $all: [ "photography", "cooking" ] } } )
逻辑表达式,$or
表示符合后续条件之一的文档
// 返回满足数组中任一元素的文档
db.student.find({ $or: [ { city: "Shanghai" }, { age: { $lt: 23 } } ] })
正则表达式,用//
圈起来
// name以J开头
db.student.find( {name: /^J/ } )
对数组的匹配,简单的{cond1,cond2...}
是整个数组中分别有元素满足各个条件即可,如果要某个元素满足全部条件,使用$elemMatch
语句
// 返回数组中存在同时满足age和name的元素的文档
db.tutor.find( {"students": { $elemMatch: { age: { $lt: 22 }, name: /^J/ } } } )
// 返回数组中存在满足age的元素和满足name元素的文档
db.tutor.find( { "students.age": { $lt:22 }, "students.name": /^J/} )
输出限定
对第二个参数,采用key:0
或key:1
的形式表示是否输出,当存在key:1
的语句,未提及的属性均不输出(_id
除外),否则输出全部未标为key:0
的属性
// 返回_id,和name
db.student.find( { gender: "m" }, { name: 1 } ) (默认包含_id)
// 返回除birthdate,hobby以外的全部属性
db.student.find( { gender: "m" }, { birthdate: 0, hobby: 0 } )
改
支持两种操作updateOne
和updateMany
,都需要两个参数,第一个参数与find
的第一个参数完全一致,用于限定操作的范围,第二个参数表明修改的方法
$set
$set
将提及的属性置为对应的值,可以不用引号包裹$set
\\ 将所有男性的city置为Shanghai
db.student.updateMany (
{gender: "m"},
{"$set": {city: "Shanghai"}}
)
inc
$inc
将提及的属性加对应数值(可以是负数),若修改值或属性本身为字符串则报错
\\ 将所有出生月份小于9的文档age++
db.student.updateMany (
{ "birthdate.month": { $lt: 9 } },
{ "$inc": {age: 1} }
)
删
同样支持deleteOne
和deleteMany
,参数与find
的第一个参数语法相同