MongoDB 文档操作
插入文档
-
db.COLLECTION_NAME.insert(document),若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
-
db.COLLECTION_NAME.insertOne(), 向集合插入一个新文档
-
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
-
-
db.COLLECTION_NAME.insertMany(document...),向集合插入一个多个文档
-
db.collection.insertMany(
[ <document 1> , <document 2>,参数说明:
-
document:要写入的文档。
-
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
-
ordered:指定是否按顺序写入,默认 true,按顺序写入。
-
-
-
db.collection.replaceOne(),
插入数据案例:
# 直接插入一个json对象
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
# 先定义一个json对象,再插入
> document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
db.col.insert(document)
ObjectId
插入一个文档,会自动生成一个"_id":ObjectId(...)
作为主键,ObjectId 是一个12字节 BSON 类型数据,有以下格式:
-
前4个字节表示时间戳
-
接下来的3个字节是机器标识码
-
紧接的两个字节由进程id组成(PID)
-
最后三个字节是随机数。
由于 ObjectId 中存储了 4 个字节的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间
ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()
更新文档
-
db.COLLECTION_NAME.update(),更新已存在的文档
-
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)参数说明:
-
query : update的查询条件,类似sql update查询内where后面的。没有查询条件写为
{}
-
update : update的对象和一些更新的操作符(如$set...)等,也可以理解为sql update查询内set后面的,常用的更新操作符如下:
-
$set,指定一个键的值。如果这个键不存在,则创建它
-
$unset,
{$unset:{key:1}}
从文档中移除指定的键 -
$inc,
{$inc:{key:int}}
用来在已有键的值上进行加减,或者在键不存在时创建一个键。$inc就是专门来增加(和减少)数字的。"$inc"只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败 -
$rename,
{$rename:{"old":"new"}}
重命名字段名称,新的字段名称不能和文档中现有的字段名相同 -
$currentDate,将字段的值设置为当前日期,可以是
Date
或timestamp
,默认类型是Date
。如果设置的字段不存在,$currentDate
会在文档中添加该字段。格式如:{$currentDate:{字段名:时间类型,...}}
。时间类型可以是满足下面条件的任意一个:-
布尔值
true
表示将字段值设置为当前日期作为Date
; -
{$type:"timestamp"}
或{$type:"date"}
,它明确指定了类型。操作符区分大小写,仅接受小写的"timestamp"
或者小写的"date"
。
-
-
$min,更新文档中某个小于特点值的字段,
$min:{num:10}
,如果大于10
,那么值会变为10
,如果小于10
,则不会有变化。$max则相反 -
$push,用法:
{$push:{field:value}}
,把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型。(值可重复)-
追加多个值,
{$push:{$each:[v1,v2...]}}
-
追加一个数组,
{$push:[v1,v2...]}
-
-
$addToSet,用法:
{$addToSet:{field:value}}
,加一个值到数组内,而且只有当这个值在数组中不存在时才增加。(值不重复),用法同$push -
$pop,用于删除数组内的一个值,删除数组内第一个值:
{$pop:{field:-1}}
,删除数组内最后一个值:{$pop:{field:1}}
-
$pull,用法:
{$pull:{field:_value}}
,作用:从数组field内删除一个等于_value的值
-
-
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
-
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
-
writeConcern :可选,抛出异常的级别。
-
# 把likes=100的所有文档中的title更新为 'mongodb123'
db.hjy.update(
{'likes':100},{$set:{'title':'mongodb123'}},{multi:true}
) -
-
db.COLLECTION_NAME.save(),通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
-
db.collection.save(
<document>,
{
writeConcern: <document>
}
)参数说明:
-
document : 文档数据。
-
writeConcern :可选,抛出异常的级别。
-
-
删除文档
-
db.collection.remove(),移除集合中的数据
-
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
# 删除所有
db.collection.remove({})参数说明:
-
query :(可选)删除的文档的条件。
-
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
-
writeConcern :(可选)抛出异常的级别。
-
-
查询文档
-
db.collection.find(),查询文档,返回一个数组
-
db.collection.find(query, projection)
-
query :可选,使用查询操作符指定查询条件
-
projection :可选,指定需要返回的键
{"key":1}
,不显示则为0。查询时返回文档中所有键值,只需省略该参数即可(默认省略)
-
-
-
db.collection.find().pretty(),以易读的方式来读取数据,pretty() 方法以格式化的方式来显示所有文档。
-
db.collection.findOne(),返回一个文档
条件查询
-
等于 {<key>:<value>}
-
不等于 {<key>:{$ne:<value>}}
-
大于 {<key>:{$gt:<value>}} ,大于等于 {<key>:{$gte:<value>}}
-
小于 {<key>:{$lt:<value>}} ,小于等于 {<key>:{$lte:<value>}}
-
# 范围查询 x1<y<x2
{<key>:{$lt:<v1>,$gt:<v2>}}
-
-
AND条件,find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
-
db.collection.find(
{key1:value1,key2:value2}
)
-
-
OR条件
-
db.collection.find(
{$or: [
{key1: value1}, {key2:value2}
]}
)
-
-
AND 和 OR 组合
-
db.collection.find(
{ k1: v1,
$or: [
{k2:v2},{k3,v3}
]}
)
-
$type操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。不同数据类型对应不同数字,常见的的有:
Double -1,String -2,Object -3,Array -4,Binary data -5,Object id -7,Boolean -8,Date -9,Null -10
如查找某个key为字符串类型
db.hjy.find({"key":{$type:'string'}})
db.hjy.find({"key":{$type:2}})
Limit和Skip
-
db.collection.find().limit(NUMBER),limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
-
db.collection.find().limit(NUMBER).skip(NUMBER),跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
sort排序
-
db.collection.find().sort(),sort() 方法对数据进行排序,通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
-
db.collection.find().sort({key:1})
-
skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()
distinct去重
db.collection.distinct({key})
MongoDB正则表达式(模糊查询)
db.posts.find({key:{$regex:"xxx",$options:"$i"}}})
-
key,需要查找的key
-
$regex:"xxx",xxx是正则表达式
-
$options:"$i",不区分大小写