# 创建文档
db.集合名.insertOne(JSON对象)
db.集合名.insertMany(JSON数组)
若集合不存在就自动创建集合。
# 删除文档
# remove
删除单个文档或与指定过滤器匹配的所有文档。
db.集合名.remove(条件,是仅否删除一条)
# deleteOne
即使多个文档可能与指定过滤器匹配,也最多删除一个与指定过滤器匹配的文档。 3.2版中的新功能
# deleteMany
删除单个文档或与指定过滤器匹配的所有文档。
# 查询文档
db.集合名.find(条件 [,期望返回的列])
可以追加.pretty() 格式化打印结果
条件:{列: {运算符: 值}}
- 所有:{}或不写
- 查询age=6:{age: 6}
- 查询age=6,sex=男:{age:6, sex:男}
- 查询大于6岁:{age: {$gt: 6}}
- 查询6岁、18岁:{age: {$in: [6,18]} }
运算符有:
- $lt、$lte:less than、lest than equal
- $gt、$gte:great than、great than equal
- $in、$nin:in、not in
查询的列(第二参数)
- 默认显示所有的列
- 只显示age列 {age:1}
- 显示除了age列 {age:0}
# 查询运算符一览
# 查询运算符(比较)
# eq
匹配等于指定值的值。
# 查询 nickname 为 alex
db.students.findOne({nickname:{ $eq: "alex" }})
# ne
匹配不等于指定值的值。
# 查询 nickname 不为 alex
db.students.findOne({nickname:{ $ne: "alex" }})
# gt
匹配大于指定值的值。
# 查询 age 大于20 的一项
db.students.findOne({age:{ $gt: 20 }})
# gte
匹配大于等于指定值的值。
# 查询 age 大于或等于20 的一项
db.students.findOne({age:{ $gte: 20 }})
# lt
匹配小于指定值的值。
# 查询 age 小于20 的一项
db.students.findOne({age:{ $lt: 20 }})
# lte
匹配小于或等于指定值的值。
# 查询 age 小于或等于20 的一项
db.students.findOne({age:{ $lte: 20 }})
# in
匹配与数组中指定的任何值相等的值。
# 查询 age 为 20, 21 或 25 的一项
db.students.findOne({age:{ $in: [20, 21, 25] }})
# nin
匹配与数组中指定的任何值不相等的值。
# 查询 age 不为 20, 21 或 25 的一项
db.students.findOne({age:{ $nin: [20, 21, 25] }})
# 查询运算符(逻辑)
# and
使用逻辑 and 连接查询子句,返回与这两个子句条件匹配的所有文档。
# 查询 name 为 alice 且 age 等于 25 的一项
db.students.findOne({ $and: [{name: "alice"},{age: 25}]})
# or
使用逻辑 or 连接查询子句,返回与任一子句条件匹配的所有文档。
# 查询 name 为 alice 或 name 为 alex 的一项
db.students.findOne({ $or: [{name: "alice"},{name: "alex"}]})
# not
反转查询表达式的效果,并返回与查询表达式_不_匹配的文档。
# 查询 age 非大于27 的一项
db.students.findOne({ age: { $not: { $gt: 27}}})
# nor
用逻辑 NOR连接查询子句,返回所有不能匹配这两个子句的文档。
# 查询 age 非大于25 且 非0 的一项
db.students.findOne({ $nor: [ {age: { $gt: 25}}, {age: 0 }]})
# 查询运算符(元素)
# exisit
当 true时 若该字段有值 或 为null,则为搜索结果。
# 查询 books 字段有值或为null的文档
db.students.findOne({ books: { $exists: true}})
# type
若字段的类型和 type 指定的类型匹配,则返回。
# 查询 books 字段为数组的文档
db.students.findOne({ books: { $type: 'array'}})
# 其支持的类型有:double | string | object | array | object id | boolean | date | null | timestamp 等
# 更多请参考 https://www.runoob.com/mongodb/mongodb-operators-type.html
# 查询运算符(评估)
# expr
允许在查询语言中使用聚合表达式
# 联合多个运算,选出 age 大于 studyYear 的文档
db.students.findOne({ $expr: { $gt: ["$studyYear","$age"]}})
# jsonSchema
根据给定的JSON Schema验证文档。
db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "gpa" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
gender: {
bsonType: "string",
description: "must be a string and is not required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
exclusiveMaximum: false,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double and is required"
}
}
}
}
})
# expr
允许在查询语言中使用聚合表达式
# 联合多个运算,选出 age 大于 studyYear 的文档
db.students.findOne({ $expr: { $gt: ["$studyYear","$age"]}})
# mod
取模运算
# 取出qty的值,查询其对4取余等于0的数据:
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )
# regex
选择值与指定的正则表达式匹配的文档。
# 搜索 sku 字段匹配指定正则式的文档
db.products.find( { sku: { $regex: /789$/ } } )
# text
执行文本搜索。
# 匹配文本中含有coffee的BSON
db.articles.find( { $text: { $search: "coffee" } } )
# where
匹配满足JavaScript表达式的文档。
匹配name的值经过md5函数加密后匹配:
db.foo.find( { $where: function() {
return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994")
} } );
# 查询运算符(地理空间)
# geoIntersects查询运算符
选择与GeoJSON几何形状相交的几何形状。2dsphere索引支持 $geoIntersects。
# geoWithin
选择边界GeoJSON几何内的几何。2dsphere和2D指标支持 $geoWithin。
# near
返回点附近的地理空间对象。需要地理空间索引。2dsphere和2D指标支持 $near。
# nearSphere
返回球体上某个点附近的地理空间对象。需要地理空间索引。2dsphere和2D指标支持 $nearSphere。
# 查询运算符(数组)
# all
匹配包含查询中指定的所有元素的数组。
# 搜索 books 包含 java php javascript 的文档
db.students.findOne({books: {$all: ["java", "php", "javascript"]}})
# eleMatch
如果跟指定的数组有交集,则匹配。
# 搜索 books 包含 java php javascript 其中一个或多个 的文档
db.students.findOne({books: {$eleMatch: ["java", "php", "javascript"]}})
# size
如果数组字段为指定大小,则选择文档。
# 搜索 books 包含 java php javascript 其中一个或多个 的文档
db.students.findOne({books: {$size: 3}})
# 查询运算符(按位)
# bitsAllClear
匹配数字或二进制值,其中一组位的_所有_值均为 0。
# bitsAllSet
匹配数字或二进制值,其中一组位的_所有_值均为 1。
# bitsAnyClear
匹配数值或二进制值,在这些数值或二进制值中,一组位的位置中_任何_位的值为 0。
# bitsAnySet
匹配数值或二进制值,在这些数值或二进制值中,一组位的位置中_任何_位的值为 1。匹配数字或二进制值,其中一组位的_所有_值均为 0
# bitsAllClear
匹配数字或二进制值,其中一组位的_所有_值均为 0。
# 查询运算符(注释)
# comment
向查询谓词添加注释。
# 查询运算符(映射)
# elemMatch
符合指定$elemMatch条件的数组中的第一个元素。
db.test.insert({
"class":"1",
"student":[
{"name":"mac","age":18,"sex":true},
{"name":"jack","age":19,"sex":true},
{"name":"rose","age":20,"sex":false}
]
})
# 查询名字叫mac的同学的班级信息
db.test.find({
"student.name":"mac"
})
# 结果:记录能被查询出来
# 查询名字叫mac,年龄20岁的同学的班级信息
db.test.find({
"student.name":"mac",
"student.age":20
})
# 结果:记录能被查询出来.这并不是我们想要的结果.我们的记录中是有一个叫mac的同学,但是他的年龄并不是20岁,所有这次查询是不正确的.
# 这个时候就需要用到$elemMatch
db.test.find({
"student":{$elemMatch:{"name":"mac","age":20}}
})
# slice
限制从数组中投影的元素数量。支持 limit和 skip。
# 查询输出数组前三个
db.movies.find({title:"Youth Without Youth"},{languages:{$slice:3}}).pretty();
# 查询输出数组后两个
db.movies.find({title:"Youth Without Youth"},{languages:{$slice:-2}}).pretty();
# 查询输出从数组第四个开始,输出前三个
db.movies.find({title:"Youth Without Youth"},{languages:{$slice:[3,3]}}).pretty();
# 查询输出从数组倒数第五个开始,输出前四个
db.movies.find({title:"Youth Without Youth"},{languages:{$slice:[-5,4]}}).pretty();
# meta
项目在$text操作期间分配的文档分数。
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
# 更新文档
db.集合名.update(条件,更新运算符 [,是否新增, 是否修改多条])
# 更新运算符一览
# 更新运算符(字段)
# set
设置字段的值
# 修改 字段nickname 为 alex 的文档,的 nickname 字段为 alice
db.c1.update({nickname:"alex"},{$set:{nickname:"alice"}})
# unset
删除指定字段的值
# 修改 字段nickname 为 alex 的文档,删除 nickname 字段的值
db.c1.update({nickname:"alex"}, {$unset: {nickname: true}})
# inc
将字段的值增加指定的数量
# 修改 nickname 为 alex 的文档,的 age字段的值 -=2
db.c1.update({nickname:"alex"},{$inc: age: -2})
# mul
将字段的值乘以指定的数量
# 修改 nickname 为 alex 的文档,的 age字段的值 *=2
db.c1.update({nickname:"alex"},{$mul: age: 2})
# currentDate
将字段的值设置为当前日期
# 修改 nickname 为 alex 的文档,的 age字段的值 为当前时间(date类型)
db.students.updateOne({ nickname: 'alex' }, { $currentDate: { age: true})
# 修改为 date 类型
db.students.updateOne({ nickname: 'alex' }, { $currentDate: { age: { $type: "date"}}})
# 修改为 timestamp 类型
db.students.updateOne({ nickname: 'alex' }, { $currentDate: { age: { $type: "timestamp "}}})
# rename
字段重命名
# 修改 nickname 为 alex 的 nickname 字段名为 uname,此时表中增加一个字段为 uname,将该行文档 nickname中的值剪切到uname中
db.c1.update({nickname:"alex"},{$rename:{nickname: 'uname'}})
# min
仅当指定值小于现有字段值时才更新该字段。
# 如果 min 中指定的 24 小于当前字段的值,则更新,否则不更新
db.students.updateOne({ name: 'alan' }, { $min: { age: 24}})
# max
仅当指定值大于现有字段值时才更新该字段。
# 如果 min 中指定的 24 大于当前字段的值,则更新,否则不更新
db.students.updateOne({ name: 'alan' }, { $max: { age: 24}})
# setOnInsert
如果更新导致插入文档(第三参数{ upsert: true },并且无匹配的文档时,插入一个文档),则设置字段的值。对修改现有文档的更新操作没有影响。
这个比较抽象,因为是需要配合 第三参数{ upsert: true } 一起使用才有效,否则这个操作符不会产生任何影响。
如果没找到需要更新的那行文档,则创建一行文档,并把值设置进去。否则不会有任何作用。
# 查找 name: 'alice'的文档,如果没有,则插入一个文档 {name: 'alice', age: 25}}。如果有则不产生任何影响.
db.students.updateOne({ name: 'alice' }, { $setOnInsert: { age: 25}},{ upsert: true})
# 更新运算符(数组)
# addToSet
仅当元素不存在于集合中时才将它们添加到数组中。
# 查找 name: 'alan' 的文档,若有 books数组中无 php,则添加,若有则不操作。
db.students.updateOne({ name: 'alan' },{ $addToSet:{books: "php"}})
# push
将项目添加到数组。
# 查找 name: 'alan' 的文档,若有 books字段并且是数组,在books数组下增加 java;若无books字段,则创建并设置为 ["java"]
db.students.updateOne({ name: 'alan' },{ $push:{books: "java"}})
# pop
删除数组的第一项或最后一项。-1是第一个,1是最后一个。
# 查找 name: 'alan' 的文档,在books数组下删除 第一 项
db.students.updateOne({ name: 'alan' },{ $pop:{books: -1}})
# pull
删除与指定查询匹配的所有数组元素将项目添加到数组
# 查找 name: 'alan' 的文档,在books数组下删除 java 项
db.students.updateOne({ name: 'alan' },{ $pull:{books: "java"}})
# pullAll
从数组中删除所有匹配的值
# 查找 name: 'alan' 的文档,在books数组下删除 java 项 和 php 项
db.students.updateOne({ name: 'alan' },{ $pullAll:{books: ["java", "php"]}})
# 第二、三参数
- 第二参数,boolean,如果不匹配是否新增文档,默认false
- 第三参数,boolean,是否修改所有匹配的文档,默认false,即只修改第一个匹配
← Mongo Shell 聚合 →