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数据进行排序遵循以下方式(顺序从低到高):

  1. MinKey(internal type)
  2. Null
  3. Numbers(ints,longs,doubles)
  4. Symbol,String
  5. Object
  6. Array
  7. BinData
  8. ObjectId
  9. Boolean
  10. Date
  11. Timestamp
  12. Regular Expression
  13. 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()
posted @   kahnyao  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示