MongoDB增删改查
MongoDB增删改查
MongoDB的数据插入
insert的基本用法
语法
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
第一列插入单个文档或多个文档
writeConcern:可选项,是否等待从服务器同步数据。
ordered:可选项
- 如果为true,对多个文档顺序插入,如果其中一个文档在插入的时候发生了错误,则停止后面的所有的操作。
- 如果为false,无序的插入多个文档,并且当其中一个文档在插入的时候发生错误的时候,并不会停止后续的操作。
示例
db.user1.insert({
name: "zhangsan",
age: 32,
sex: "male",
phone: [123456789,234567890]
})
// 不指定_id默认会自动创建
> db.user1.find()
{ "_id" : ObjectId("67c28b3b7a1aa33c7b5e55e3"), "name" : "zhangsan", "age" : 32, "sex" : "male", "phone" : [ 123456789, 234567890 ] }
db.user2.insert({
_id: 1,
name: "zhangsan",
age: 32,
type: 1,
status: "P",
favorites: {artist: "Picasso",food: "pizza"},
finished: [17,3],
badges: ["blue","black"],
points: [
{points: 85,bonus: 20},
{points: 85,bonus: 10}
]
})
// 显式指定_id会使用
> db.user2.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 32, "type" : 1, "status" : "P", "favorites" : { "artist" : "Picasso", "food" : "pizza" }, "finished" : [ 17, 3 ], "badges" : [ "blue", "black" ], "points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 85, "bonus" : 10 } ] }
一次性插入多条(insert、bulk)
insert/insertMany
示例
db.user3.insert([
{_id: 1,name: "zhangsan"},
{_id: 2,name: "lisi"}
])
// 提示信息
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
db.user4.insertMany([
{_id:1,name: "zhangsan"},
{_id:2,name: "lisi"}
])
// 提示信息
{ "acknowledged" : true, "insertedIds" : [ 1, 2 ] }
bulk
// 无序批量插入
db.user.drop()
var bulk = db.user.initializeUnorderedBulkOp();
bulk.insert({_id: 1,name: "zhangsan",age: 32});
bulk.insert({_id: 2,name: "lisi",age: 30});
bulk.insert({_id: 3,name: "wangwu",age: 35});
bulk.execute();
// 有序批量插入
db.user.drop()
var bulk = db.user.initializeOrderedBulkOp();
bulk.insert({_id: 1,name: "zhangsan",age: 32});
bulk.insert({_id: 2,name: "lisi",age: 30});
bulk.insert({_id: 3,name: "wangwu",age: 35});
bulk.execute();
save的用法
语法
db.collection.save(
<document>,
{ writeConcern: <document> }
)
save和insert的区别:
- save一次不能保存多个文档
- save的文档存在时直接更新,不存在则insert
示例
> db.user.find({name: "zhangsan"})
{ "_id" : 1, "name" : "zhangsan", "age" : 32 }
// 不以_id为基准的话,会直接插入,因为_id会不一样
> db.user.find({name: "zhangsan"})
{ "_id" : 1, "name" : "zhangsan", "age" : 32 }
{ "_id" : ObjectId("67c28ccd7a1aa33c7b5e55e4"), "name" : "zhangsan" }
// _id 存在场景下更新
> db.user.save({_id: 1, name: "lisi"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : 1, "name" : "lisi" }
{ "_id" : 2, "name" : "lisi", "age" : 30 }
{ "_id" : 3, "name" : "wangwu", "age" : 35 }
{ "_id" : ObjectId("67c28ccd7a1aa33c7b5e55e4"), "name" : "zhangsan" }
// _id 不存在场景下插入
> db.user.save({_id:100,name: "Tom"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 100 })
> db.user.find()
{ "_id" : 1, "name" : "lisi" }
{ "_id" : 2, "name" : "lisi", "age" : 30 }
{ "_id" : 3, "name" : "wangwu", "age" : 35 }
{ "_id" : ObjectId("67c28ccd7a1aa33c7b5e55e4"), "name" : "zhangsan" }
{ "_id" : 100, "name" : "Tom" }
使用的测试数据
db.student.insertOne({_id: 1,name: "zhangsan",age: 12,teacher: ["Tom","Jack"]});
db.student.insertOne({_id: 2,name: "lisi",age: 15,teacher: ["Lucy","Tom"]});
db.student.insertOne({_id: 3,name: "wangwu",age: 11,teacher: ["Jack","Lily"]});
db.student.insertOne({_id: 4,name: "sunqi",age: 10,teacher: ["Dave","John","Arthur"]});
db.student.insertOne({_id: 5,name: "zhouba",age: 16,teacher: ["Jack","Ben"]});
db.student.insertOne({_id: 6,name: "wujiu",age: 17,teacher: ["Jack","John"]});
MongoDB的数据查询
find/findOne的简单使用
https://www.mongodb.com/zh-cn/docs/manual/reference/command/find/
语法
> db.student.findOne
function (query, fields, options, readConcern) {
var cursor = this.find(query, fields, -1 /* limit */, 0 /* skip*/, 0 /* batchSize */, options);
if (readConcern) {
cursor = cursor.readConcern(readConcern);
}
if (!cursor.hasNext())
return null;
var ret = cursor.next();
if (cursor.hasNext())
throw Error("findOne has more than 1 result!");
if (ret.$err)
throw _getErrorWithCode(ret, "error " + tojson(ret));
return ret;
}
示例
// 自带pretty效果
> db.student.findOne()
{
"_id" : 1,
"name" : "zhangsan",
"age" : 12,
"teacher" : [
"Tom",
"Jack"
]
}
> db.student.find().limit(1)
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
find的语法
db.collection.find(query,projection)
// projection中 {field1:0,field2:1} field1不显示,field2显示 _id是默认显示的,需手动指定0,才会不显示
示例
// 只显示name和默认的_id
> db.student.find({},{name:1})
{ "_id" : 1, "name" : "zhangsan" }
{ "_id" : 2, "name" : "lisi" }
{ "_id" : 3, "name" : "wangwu" }
{ "_id" : 4, "name" : "sunqi" }
{ "_id" : 5, "name" : "zhouba" }
{ "_id" : 6, "name" : "wujiu" }
// 只显示name
> db.student.find({},{_id:0,name:1})
{ "name" : "zhangsan" }
{ "name" : "lisi" }
{ "name" : "wangwu" }
{ "name" : "sunqi" }
{ "name" : "zhouba" }
{ "name" : "wujiu" }
// 只显示name,age
> db.student.find({},{_id:0,name:1,age:1})
{ "name" : "zhangsan", "age" : 12 }
{ "name" : "lisi", "age" : 15 }
{ "name" : "wangwu", "age" : 11 }
{ "name" : "sunqi", "age" : 10 }
{ "name" : "zhouba", "age" : 16 }
{ "name" : "wujiu", "age" : 17 }
配合特殊条件查询
操作符说明
操作符 | 说明 |
---|---|
$eq |
等于 |
$ne |
不等于 |
$in |
包含,类似sql中的in |
$nin |
不包含,类似sql中的not in |
$or |
或,并集关系 |
$nor |
不或,既不又不 |
$and |
与,交集关系 |
$gt |
大于 |
$gte |
大于等于 |
$lt |
小于 |
$lte |
小于等于 |
$not |
取反 |
$exists |
存在操作符 |
$type |
类型操作符 |
#mod |
取余操作符 |
等值匹配
示例:
// 对应SQL的:select * from student where name = 'zhangsan';
> db.student.find({name: "zhangsan"})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
> db.student.find({name: {$eq: "zhangsan"}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
// 对应SQL的:select * from student where name <> 'zhangsan';
> db.student.find({name: {$ne: "zhangsan"}})
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
in查询
语法
{field: {$in: [<value1>,<value2>, ... <valueN> ]}}
示例
// 对应SQL: select * from student where name in ('zhangsan','lisi');
> db.student.find({name: {$in: ["zhangsan","lisi"]}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
// 对应SQL: select * from student where name not in ('zhangsan','lisi');
> db.student.find({name: {$nin: ["zhangsan","lisi"]}})
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
or查询
语法:是表达式与表达式的关系
{$or: [{<expression1>},{<expression2>}, ... ,{<expressionN>}]}
示例:
// 对应SQL:select * from student where name = 'zhangsan' or age = 10;
> db.student.find({$or: [{name: "zhangsan"},{age: 10}]})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
// 对应SQL:select * from student where name <> 'zhangsan' or age <> 10;
> db.student.find({$nor: [{name: "zhangsan"},{age: 10}]})
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
and查询
语法
{$and: [{<expression1>},{<expression2>}, ... ,{<expressionN>}]}
示例
// 对应SQL:select * from student where name='zhangsan' and age=12;
> db.student.find({$and: [{name: "zhangsan"},{age: 12}]})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
> db.student.find({name: "zhangsan",age: 12})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
比较运算符
语法
{field: {$gt: value}}
示例
// 对应SQL:select * from student where age>15;
> db.student.find({age: {$gt: 15}})
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
// 对应SQL:select * from student where age>=15;
> db.student.find({age: {$gte: 15}})
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
// 对应SQL:select * from student where name in ('zhangsan','lisi','wangwu') and age >12 and age<=17;
> db.student.find({name: {$in: ["zhangsan","lisi","wangwu"]},age: {$gt: 12,$lte: 17}})
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
not查询
示例
// 对应SQL:select * from student where not(age > 16);
> db.student.find({age: {$not: {$gt: 16}}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
// 等价于
> db.student.find({age: {$lte: 16}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
注意:在不存在的字段上$not
操作符不会去比较,会直接返回,这点需要注意,如下示例
// 插入异常值
db.student.insertOne({_id: 7,name: "zhengshi",age: null});
db.student.insertOne({_id: 8,name: "Tshiyi"});
// 集合内容
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
{ "_id" : 7, "name" : "zhengshi", "age" : null }
{ "_id" : 8, "name" : "Tshiyi" }
// 查询age大于16的文档
> db.student.find({age: {$gt: 16}})
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
// 使用$not操作符
> db.student.find({age: {$not: {$gt: 16}}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 7, "name" : "zhengshi", "age" : null }
{ "_id" : 8, "name" : "Tshiyi" }
// 排除age值为null值和age字段不存在的文档,同时对age > 16使用$not操作符
> db.student.find({age: {$not: {$gt: 16},$ne: null,$exists: true}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
exists
语法
{field: {$exists: <boolean>}}
示例
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
{ "_id" : 7, "name" : "zhengshi", "age" : null }
{ "_id" : 8, "name" : "Tshiyi" }
// 返回存在age键的文档
> db.student.find({age: {$exists: true}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
{ "_id" : 7, "name" : "zhengshi", "age" : null }
// 删除异常值
db.student.remove({_id: {$in: [7,8]}});
type
语法
{field: {$type: <bson type number>}}
说明
Type | Number | Alias | Notes |
---|---|---|---|
Double | 1 | "double" | |
String | 2 | "string" | |
Object | 3 | "object" | |
Array | 4 | "array" | |
binary data | 5 | "binData" | |
undefined | 6 | "undefined" | deprecated |
objectId | 7 | "objectId" | |
boolean | 8 | "bool" | |
date | 9 | "date" | |
null | 10 | "null" | |
regular expression | 11 | "regex" | |
DBPointer | 12 | "dbPointer" | |
JavaScript | 13 | "javascript" | |
Symbol | 14 | "symbol" | |
JavaScript(with scope) | 15 | "javascriptWithScope" | |
32-bit integer | 16 | "int" | |
Timestamp | 17 | "timestamp" | |
64-bit integer | 18 | "long" | |
Min key | -1 | "minKey" | |
Max key | 127 | "maxKey" |
示例
// 使用类型编号
> db.student.find({name: {$type: 1}})
> db.student.find({name: {$type: 2}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
// 插入一条其他类型数据
> db.student.insertOne({_id:7,name: 100});
{ "acknowledged" : true, "insertedId" : 7 }
> db.student.find({name: {$type: 1}})
{ "_id" : 7, "name" : 100 }
// 使用类型别名
> db.student.find({name: {$type: "string"}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
> db.student.find({name: {$type: "double"}})
{ "_id" : 7, "name" : 100 }
// 删除插入的数据
db.student.remove({_id: 7});
mod
语法
{field: {$mod: [divisor,remainder]}}
示例
// age能被2整除的文档
> db.student.find({age: {$mod: [2,0]}})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
// age除2余1文档
> db.student.find({age: {$mod: [2,1]}})
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
sort排序
语法
cursor.sort(sort),{field: value} // 1是升序,-1是降序
sort顺序
MongoDB中不同类型的BSON数据进行排序遵循以下方式(顺序从低到高):
- MinKey(internal type)
- Null
- Numbers(ints,longs,doubles)
- Symbol,String
- Object
- Array
- BinData
- ObjectId
- Boolean
- Date
- Timestamp
- Regular Expression
- MaxKey(internal type)
示例
// 按照age升序排序
> db.student.find({}).sort({age:1})
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
// 先按照_id升序,再按照age升序
> db.student.find({}).sort({_id:1,age:1})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
limit限制返回行数
语法
cursor.limit(n)
示例
> db.student.find().limit(1)
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
>
> db.student.find().sort({name:1}).limit(2)
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
skip翻页
语法
cursor.skip()
示例
> db.student.find({},{name:1}).sort({_id:-1})
{ "_id" : 6, "name" : "wujiu" }
{ "_id" : 5, "name" : "zhouba" }
{ "_id" : 4, "name" : "sunqi" }
{ "_id" : 3, "name" : "wangwu" }
{ "_id" : 2, "name" : "lisi" }
{ "_id" : 1, "name" : "zhangsan" }
> db.student.find({},{name:1}).sort({_id:-1}).skip(1).limit(3)
{ "_id" : 5, "name" : "zhouba" }
{ "_id" : 4, "name" : "sunqi" }
{ "_id" : 3, "name" : "wangwu" }
说明:skip尽量少用,会消化大量的CPU资源,如果要使用翻页,可以添加id等计数器,可以直接索引到要找的数据,而不需要翻页
MongoDB的数据修改
update()的基本用法
语法
db.collection.update(
<query>, // 查询条件
<update>, // update的内容
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
} // 可选参数
)
示例
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
> db.student.update({_id: 6},{name: "Tom"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "Tom" }
注意:update在不使用操作符的情况下,实际是根据query部分的查询,把符合记录的文档根据update的内容替换掉(只保留_id键值信息)
update()的操作符
操作符 | 说明 |
---|---|
$set |
更新指定键的操作符 |
$inc |
自增器 |
$rename |
重命名field |
$unset |
删除某一列 |
$currentDate |
对某一列的值更新为当前时间 |
$push |
把内容追加到现有的文档中去 |
$pushAll |
一次性追加多条数据 |
$pull |
移除匹配到的所有的值 |
$pullAll |
删除多个值 |
$pop |
去除最后一个或者第一个的值即可 |
$addToSet |
若数据中没有该值,则添加,否则不添加 |
$set
说明:
若在$set后添加了一个新的field,则会在该文档末尾追一对键值对
示例:
> db.student.find({_id: 6})
{ "_id" : 6, "name" : "Tom" }
> db.student.update({_id: 6},{$set: {name: "wujiu"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 6})
{ "_id" : 6, "name" : "wujiu" }
// $set 后添加新的键值对
> db.student.update({_id: 6},{$set: {name: "wujiu",age: 17,teacher: ["Jack","John"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 6})
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
$inc
增量器
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 12, "teacher" : [ "Tom", "Jack" ] }
> db.student.update({_id: 1},{$inc: {age:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 13, "teacher" : [ "Tom", "Jack" ] }
> db.student.find({name: "zhangsan"})
{ "_id" : 1, "name" : "zhangsan", "age" : 13, "teacher" : [ "Tom", "Jack" ] }
> db.student.update({name: "zhangsan"},{$inc: {age:-10}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({name: "zhangsan"})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ] }
$currentDate
对某一列的值更新为当前时间,键不存在,则自动追加尾部
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ] }
> db.student.update({_id: 1},{$currentDate: {date: true}}) // 这里的date是键名,可以任意指定
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ], "date" : ISODate("2025-03-01T05:25:32.779Z") }
$rename
重命名键
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ], "date" : ISODate("2025-03-01T05:25:32.779Z") }
> db.student.update({_id: 1},{$rename: {date: "new_date"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ], "new_date" : ISODate("2025-03-01T05:25:32.779Z") }
> db.student.find()
{ "_id" : 2, "name" : "lisi", "age" : 15, "teacher" : [ "Lucy", "Tom" ] }
{ "_id" : 3, "name" : "wangwu", "age" : 11, "teacher" : [ "Jack", "Lily" ] }
{ "_id" : 4, "name" : "sunqi", "age" : 10, "teacher" : [ "Dave", "John", "Arthur" ] }
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ], "new_date" : ISODate("2025-03-01T05:25:32.779Z") }
$unset
删除某个键
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ], "new_date" : ISODate("2025-03-01T05:25:32.779Z") }
> db.student.update({_id: 1},{$unset: {new_date: ""}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ] }
$push
把内容追加到现有的文档中去,针对的是数组
{$push: {<field1>: <value1>, ...}}
示例
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ] }
// 添加内嵌文档
> db.student.update({_id: 1},{$set: {class_info : {class: 2,grade: 2}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ], "class_info" : { "class" : 2, "grade" : 2 } }
// 针对文档push报错
> db.student.update({_id: 1},{$push: {class_info: {test_key: "test_value"}}})
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16837,
"errmsg" : "The field 'class_info' must be an array but is of type Object in document {_id: 1.0}"
}
})
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy" ], "class_info" : { "class" : 2, "grade" : 2 } }
> db.student.update({_id: 1},{$unset: {class_info: ""}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack" ] }
// 针对数组push元素
> db.student.update({_id: 1},{$push: {teacher: "Lucy"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy" ] }
// 针对数组push数组
> db.student.update({_id: 1},{$push: {teacher: ["new_push"]}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ] ] }
// 针对数组push一个文档
> db.student.update({_id: 1},{$push: {teacher: {id: 666,name: "Jack"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" } ] }
// 一次性添加多个元素
> db.student.update({_id: 1},{$push: {teacher: {$each: ["teacher1","teacher2"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2" ] }
// 一次性添加多个文档
> db.student.update({_id: 1},{$push: {teacher: {$each: [{_id:1,name: "name1"},{_id:2,name: "name2"}]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2", { "_id" : 1, "name" : "name1" }, { "_id" : 2, "name" : "name2" } ] }
$pushAll
一次性追加多条数据
{$pushAll: {<field>: [<value1>,<value2>, ... ]}}
$pushall与$push区别是后面跟数组的时候不用加$each
示例
> db.student.update({_id: 1},{$pushAll: {teacher: [{_id: 1},{_id: 2},{_id: 3}]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2", { "_id" : 1, "name" : "name1" }, { "_id" : 2, "name" : "name2" }, { "_id" : 1 }, { "_id" : 2 }, { "_id" : 3 } ] }
$pull
移除匹配到的所有的值
{$pull: {<field1>: <value|condition>,<field2>: <value|condition>, ...}}
示例
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2", { "_id" : 1, "name" : "name1" }, { "_id" : 2, "name" : "name2" }, { "_id" : 1 }, { "_id" : 2 }, { "_id" : 3 } ] }
// 删除数组单个元素(如果匹配到的结果有多个都会被删除)
> db.student.update({_id: 1},{$pull: {teacher: {_id: 1}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2", { "_id" : 2, "name" : "name2" }, { "_id" : 2 }, { "_id" : 3 } ] }
// 一次匹配删除多个元素
> db.student.update({_id: 1},{$pull: {teacher: {$in: [{_id: 2},{_id: 3},{_id: 2,name: "name2" }]}}})
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2" ] }
$pullAll
删除多个值
{$pullAll: {<field1>: [<value1>,<value2> ...]...}}
示例
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", [ "new_push" ], { "id" : 666, "name" : "Jack" }, "teacher1", "teacher2" ] }
> db.student.update({_id: 1},{$pullAll: {teacher: [[ "new_push" ],{ "id" : 666, "name" : "Jack" }]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", "teacher1", "teacher2" ] }
$pop
去除最后一个或者第一个的值即可
{$pop: {<field>:<-1|1>, ...}} // -1 代表第一个,1代表最后一个
示例
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", "teacher1", "teacher2" ] }
// 删除最后一个值
> db.student.update({_id: 1},{$pop: {teacher: 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy", "teacher1" ] }
> db.student.update({_id: 1},{$pop: {teacher: 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Tom", "Jack", "Lucy" ] }
// 删除第一个值
> db.student.update({_id: 1},{$pop: {teacher: -1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Jack", "Lucy" ] }
$addToSet
若数据中没有该值,则添加,否则不添加
{$addToSet: {<field1>: <value1>, ...}}
$pull可以无限添加,可以重复添加元素,而$addToSet只能添加一次
示例
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Jack", "Lucy" ] }
> db.student.update({_id: 1},{$addToSet: {teacher: "Tom"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.update({_id: 1},{$addToSet: {teacher: "Tom"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.student.update({_id: 1},{$addToSet: {teacher: "Tom"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
// 多次执行命令,只插入一次
> db.student.find({_id: 1})
{ "_id" : 1, "name" : "zhangsan", "age" : 3, "teacher" : [ "Jack", "Lucy", "Tom" ] }
upsert
upsert是在update的第三列中,作为可选参数,默认为false。即不会在不匹配的情况下插入文档(没有匹配到不会进行任何操作)。
若为true的情况下,如果匹配到了查询条件后,update语句里的键值对若已经存在,则修改,不存在则插入。
示例
> db.student.insertOne({_id: 7,name: "Tshiyi",age: 13})
{ "acknowledged" : true, "insertedId" : 7 }
> db.student.find({_id: 7})
{ "_id" : 7, "name" : "Tshiyi", "age" : 13 }
> db.student.update({_id: 7},{$set: {name: "Tshiyi1"}},{upsert: true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 7})
{ "_id" : 7, "name" : "Tshiyi1", "age" : 13 }
// 不加操作符效果和update一样
> db.student.update({_id: 7},{name: "Tshiyi2"},{upsert: true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find({_id: 7})
{ "_id" : 7, "name" : "Tshiyi2" }
// 操作一个不存在的_id,指定upsert 为true
> db.student.update({_id: 1000},{name: "zhangsan"},{upsert: true});
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 1000 }) // nUpserted 表示插入了记录
> db.student.find({_id: 1000})
{ "_id" : 1000, "name" : "zhangsan" }
// 操作一个不存在的_id,指定upsert 为false
> db.student.update({_id: 2000},{name: "zhangsan"})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.student.find({_id: 2000});
>
// 删除测试数据
db.student.remove({_id: {$in: [7,1000]}})
多条同时修改
MongoDB默认对update操作都是只修改1条,想要修改多条记录可以使用multi选项。
示例
// 插入name重复的数据
db.student.insertOne({_id: 100,name: "Tom"})
db.student.insertOne({_id: 101,name: "Tom"})
db.student.insertOne({_id: 102,name: "Tom"})
db.student.insertOne({_id: 103,name: "Tom"})
> db.student.find({name: "Tom"})
{ "_id" : 100, "name" : "Tom" }
{ "_id" : 101, "name" : "Tom" }
{ "_id" : 102, "name" : "Tom" }
{ "_id" : 103, "name" : "Tom" }
// 不使用操作符直接使用
> db.student.update({name: "Tom"},{name: "Tom666"},{multi: true})
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 9,
"errmsg" : "multi update only works with $ operators" // 提示必须使用操作符
}
})
> db.student.update({name: "Tom"},{$set: {name: "Tom666"}},{multi: true})
WriteResult({ "nMatched" : 4, "nUpserted" : 0, "nModified" : 4 })
> db.student.find({name: "Tom"})
> db.student.find({name: "Tom666"})
{ "_id" : 100, "name" : "Tom666" }
{ "_id" : 101, "name" : "Tom666" }
{ "_id" : 102, "name" : "Tom666" }
{ "_id" : 103, "name" : "Tom666" }
MongoDB的数据删除
remove()的基本用法
语法
db.collection.remove(
<query>, // 查询条件
{
justOne: <boolean>, // justOne,只删除满足条件的文档中的一条。默认是false
WriteConcern: <document> // WriteConcern和insert里的是一个意思
} // 可选参数
)
示例
> db.student.find({name: "Tom666"})
{ "_id" : 100, "name" : "Tom666" }
{ "_id" : 101, "name" : "Tom666" }
{ "_id" : 102, "name" : "Tom666" }
{ "_id" : 103, "name" : "Tom666" }
// 默认删除选项
> db.student.remove({_id: 100})
WriteResult({ "nRemoved" : 1 })
> db.student.find({_id: 100});
>
> db.student.find({name: "Tom666"})
{ "_id" : 101, "name" : "Tom666" }
{ "_id" : 102, "name" : "Tom666" }
{ "_id" : 103, "name" : "Tom666" }
// 只删除一个文档
> db.student.remove({name: "Tom666"},{justOne: true})
WriteResult({ "nRemoved" : 1 })
> db.student.find({name: "Tom666"})
{ "_id" : 102, "name" : "Tom666" }
{ "_id" : 103, "name" : "Tom666" }
// 不限制删除的文档数
> db.student.remove({name: "Tom666"})
WriteResult({ "nRemoved" : 2 })
> db.student.find({name: "Tom666"})
>
remove()的范围删除
remove结合query语句实现范围删除
示例
// 查询年龄大于15的文档
> db.student.find({age: {$gt: 15}})
{ "_id" : 5, "name" : "zhouba", "age" : 16, "teacher" : [ "Jack", "Ben" ] }
{ "_id" : 6, "name" : "wujiu", "age" : 17, "teacher" : [ "Jack", "John" ] }
// 删除年龄大于15的文档
> db.student.remove({age: {$gt: 15}})
WriteResult({ "nRemoved" : 2 })
> db.student.find({age: {$gt: 15}})
>
drop()的用法
语法
> db.student.drop
function () {
if (arguments.length > 0)
throw Error("drop takes no argument");
var ret = this._db.runCommand({drop: this.getName()});
if (!ret.ok) {
if (ret.errmsg == "ns not found")
return false;
throw _getErrorWithCode(ret, "drop failed: " + tojson(ret));
}
return true;
}
> db.dropDatabase
function () {
if (arguments.length)
throw Error("dropDatabase doesn't take arguments");
return this._dbCommand({dropDatabase: 1});
}
示例
// 删除集合
db.collection.drop()
// 删除整个数据库
db.dropDatabase()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异