mongoDB使用笔记(一)-基本操作

mongoDB是一个文档型数据库,支持各种增删改查操作。其命令形式与OO更为类似,语句形式为“database.collection.operation({argc})”。作为文档型数据库,mongoDB不需要提前初始化数据库和文档集,在第一个操作时会自动初始化。

支持insertOneinsertMany两种操作,前者直接按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"]
  }
])

同样支持两个操作findOnefind,后者返回全部符合条件的文档

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:0key: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 } )

支持两种操作updateOneupdateMany,都需要两个参数,第一个参数与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} }
)

同样支持deleteOnedeleteMany,参数与find的第一个参数语法相同

posted @ 2020-09-24 10:16  wengsy150943  阅读(128)  评论(0编辑  收藏  举报