- 新增:当向集合插入文档时,如果没有给文档指定_id属性(可以自行指定),则数据库会自动为文档添加一个_id,该属性用来作为文档的唯一标识,可以使用ObjectId()生成
- 一次性插入大量数据:可以先把所有数据放在一个新数组中,然后一次性插入数组
1 /* <collection>集合名,doc是需要插入的对象
2 db.<collection>.insert(doc) 向当前数据库的集合中插入一个或多个文档,doc为一个json对象或者json对象的List列表
3 db.<collection>.insertOne(doc) 向当前数据库的集合中 插入一个文档,doc为一个json对象
4 db.<collection>.insertMany(doc) 向当前数据库的集合中插入多个文档,doc为json对象的List列表
5 */
6 // 示例如下
7 db.runoob.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个Nosql数据库', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 1200 });
8 var doc1 = {title: 'HTML 教程', description: 'HTML编写网页', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['HTML', 'JavaScript', 'CSS'], likes: 1010 }
9 var doc2 = {title: 'ASP.NET 教程', description: 'ASP.NET编写网页', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['Web Froms', 'Web API', 'MVC', 'WCF'], likes: 1000 }
10 var doc3 = {title: 'JAVA 教程', description: 'JAVA编写网页', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['JSP', 'Spring'], likes: 1560}
11 db.runoob.insert([doc1,doc2,doc3]); //一次性插入多个数据
12 db.runoob.find()
- 删除:remove()方法不会真正的释放空间,需要继续执行db.repairDatabase()回收磁盘空间
1 /* db.<collection>.remove(<query>,<option>) 删除所有符合条件的文档,默认情况删除多个
2 option:justOne为true时,只删除一个,默认为false;writeConcern:抛出异常的级别
3 db.<collection>.remove({}) 删除集合的所有文档,传递的是一个空参数,这是一条条删除,性能较低
4 db.<collection>.deleteOne() 删除一个符合条款的文档
5 db.<collection>.deleteMany() 删除所有的符合条件的文档
6 */
7 db.runoob.remove({_id:ObjectId("5d352450b595146edeaac430")})
8 db.runoob.remove({by:"菜鸟教程"},true) //只删除一个
9 db.runoob.find()
1 /* 如果需要修改指定属性,需要使用 修改操作符 $set:用来修改文档中的指定属性;$unset:用来删除文档中的指定属性
2 db.<collection>.update(<query>,<update>,<options>) 使用新对象替换符合查询条件的旧对象,当有多个符合条件的对象,默认只修改一个
3 <query>:查询条件,类似where语句;<update>:新文档,类似于update语句中的set,需要使用修改操作符
4 <options>:可选配置
5 upsert:为true时,如果没有匹配到符合的文档,则进行插入,默认false;
6 multi:为true时,可以一次性修改所有符合条件的文档;
7 writeConcern:抛出异常的级别
8 可以修改可选参数配置的multi:true
9 db.<collection>.updateMany() 同时修改多个符合条件的文档
10 db.<collection>.updateOne() 修改一个符合条件的文档
11 db.<collection>.replaceOne() 替换一个文档
12 db.<collection>.save(doc) 保存文档
13 save()方法接受一个键值对对象作为参数,如果指定的文档已经存在于数据库中,就将其更新为指定的值,否则插入一个文档,应该是根据_id匹配
14 */
15 db.runoob.update({title:"MongoDB 教程"},{by:"新菜鸟教程"}) // 直接把{by:"新菜鸟教程"}替换到旧文档中了
16 db.runoob.update({title:"HTML 教程"},{$set:{url:"new url"},$inc:{likes:100}}) // set url="new url",likes+=100
17 db.runoob.update({title:"ASP.NET 教程"},{$unset:{url:""}}) // 移除url属性
18 db.runoob.updateMany({by:"菜鸟教程"},{$set:{by:"新菜鸟教程"}}) // 修改全部符合条件文档
19 db.runoob.update({by:"新菜鸟教程"},{$set:{by:"菜鸟教程"}},{multi:true}) // 修改全部符合条件文档
20 db.runoob.find()
1 /* 传递的参数是筛选条件 {字段名:字段值} 等同 where 字段名=字段值
2 db.<collection>.find(query, projection) 查询集合中所有符合条件的文档,返回一个数组
3 db.<collection>.findOne(query, projection) 查询集合中所有符合元素的第一个文档,返回一个对象
4 db.<collection>.find(query, projection).count() 返回集合中所有符合元素的文档的数量,返回一个数字
5 db.<collection>.find(query, projection).pretty() 查询集合中所有符合条件的文档,格式化显示
6 query:查询条件;projection:使用投影操作符指定显示的字段
7 */
8 db.runoob.find() //select * from runoob
9 db.runoob.find({}) //select * from runoob
10 db.runoob.find({_id:ObjectId("5d352450b595146edeaac430")}) // select * from runoob where _id=ObjectId("5d352450b595146edeaac430")
11 db.runoob.find({by:"菜鸟教程",title:"MongoDB 教程"}) // select * from runoob where by="菜鸟教程" and title="MongoDB 教程"
12 db.runoob.findOne({by:"菜鸟教程"}) // select TOP 1 * from runoob where by="菜鸟教程"
13 db.runoob.findOne({title:"MongoDB 教程"})._id // 返回一个值=(select _id from runoob where title="MongoDB 教程")
14 db.runoob.find({}).count() // select COUNT(1) from runoob
15 //select title from runoob where title="HTML 教程" {title:1,_id:0} 1代表显示,0代表不显示
16 db.runoob.find({title:"HTML 教程"},{title:1,_id:0})
17
18 db.runoob.distinct("tags",{by:"菜鸟教程"}) // 查找by="菜鸟教程"的tags属性组合为一个数组,且去重
19 db.runoob.find({"key.chl":values}) // 查找子文档属性key下的chl属性为values的文档
1 $inc // 增加
2 $rename // 重命名某一列
3 $serOnInsert // 当upsert为true时,并进行insert操作时,可以补充的字段
4 $set // 用来修改文档中的指定属性
5 $unset // 用来删除文档中的指定属性
6 db.runoob.update({title:"HTML 教程"},{$set:{url:"new url"},$inc:{likes:100}}) // set url="new url",likes+=100
7 db.runoob.update({title:"ASP.NET 教程"},{$rename:{url:"newurl"}}) // 重命名某一列,将url列改为newurl
8 // 如果没有符合条件的文档,则直接插入该文档
9 db.runoob.update({title:"CSS 教程"},{$set:{description:"CSS learn"},$setOnInsert:{by:"菜鸟教程"}},{upsert:true})
10 db.runoob.updateMany({by:"菜鸟教程"},{$set:{by:"新菜鸟教程"}}) // 修改全部符合条件文档
11 db.runoob.update({title:"ASP.NET 教程"},{$unset:{url:""}}) // 移除url属性
12 $addToSet // 在既有数组上添加元素,格式为 {$addToSet:{key:value}},key为数组类型的属性
13 $pop // 删除数组的第一个元素或最后一个元素,格式为 {$pop:{key:1/-1}},key为数组类型的属性;为1时删除第一个元素,为-1时删除最后一个元素
14 $pullAll // 从数组中删除多个值,格式为 {$pullAll:{key:[value1,value2...]}}
15 $pull // 从数组中删除符合查询条件的文档,格式为 {$pull:{key:<query>}}
16 $push // 在数组中添加一个元素,对于简单数组,格式为 {$push:{key:add_value}};对于对象数组,格式为 {$push:{key:{field:add_value}}}
17 $each // 在数组添加多个元素,格式为 {key:{$each:[value1,value2...]}},{$push:{key:{$each:[value1,value2...]}}},$push和$addToSet的限制符
18 $slice // 用于限制更新后的数组长度,格式为 {key:{$slice:<num>}},$push的限制符
19 $sort // 用来将数组中的文档重新排序,$push的限制符
20 $bit // 对整数值执行按位与和或元素,格式为 {$bit:{key:{and:<int>}}},使用and、or、XOR
- 查询表达式
- 条件操作符:$gt:>大于;$lt:<小于;$gte:>=大于等于;$lte:<=小于等于;$ne:!=不等于;$eq:=等于;$in:in;$nin:not in;$all:指数组所有单元匹配;$size:判断数组类型的属性长度;$elemMatch:判断数组类型属性或者判断子文档数组中的字段
- 逻辑操作符:$or:or或者;$and:and;$not:not;$nor:指所有的列举条件都不应成功则为真;
- 元素运算符:$exists:某列存在则为真;$mod:满足某求余条件则为真;$type:匹配字段的数据类型,并返回结果
- limit()方法:接受一个数字参数,该参数指定从MongoDB中读取的记录条数
- skip()方法:来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数
- sort()方法:通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
- JS运算符:$where:js表达式为真则为真;$regex:正则表达式匹配为真则为真
1 db.col.find({key:value}) // 等于 {<key>:<value>} where key=value
2 db.col.find({key:{$lt:1000}}) // 小于 {<key>:{$lt:<value>}} where key<1000
3 db.col.find({key:{$lte:1000}}) // 小于等于 {<key>:{$lte:<value>}} where key<=1000
4 db.col.find({key:{$gt:1000}}) // 大于 {<key>:{$gt:<value>}} where key>1000
5 db.col.find({key:{$gte:1000}}) // 大于等于 {<key>:{$gte:<value>}} where key>=1000
6 db.col.find({key:{$ne:1000}}) // 不等于 {<key>:{$ne:<value>}} where key!=1000
7 db.col.find({key:{$gt:40,$lt:50}}) // where key>40 and key<50
8 db.col.find({key:{$in:[value1,value2...]}}) // where key in (value1, value2)
9 db.col.find({key:{$nin:[value1,value2...]}}) // where key not in (value1, value2)
10 dd.col.find({key:{$all:[value1,value2...]}}) // 匹配key中包含value1,value2...元素的文档
11 db.col.find({key:{$size:N}}) // key属性为数组类型,匹配key数组长度为N的文档
12
13 db.col.find({key1:value1, key2:value2}) // and操作 where key1=value1 and key2=value2
14 db.col.find({$and:[{key:{$gte:100}},{key:{$lte:500}}]}) // and操作 where key>=100 and key<=500
15 db.col.find({$or:[{key1: value1},{key2:value2}]}) // or操作 where key1=value1 or key2=value2
16 db.col.find({key1:value1,$or:[{key2:value2},{key3:value3}]}) // where key1=value1 and (k2=v2 or k3=v3)
17 db.col.find({key:{$not:{$in:[10,12,13]}}}) // where key not in(10,12,13)
18 db.col.find({$nor:[{key1:value1}, {key2:value2},....]}) // where key1!=value1 and key2!=value2.....
19
20 db.col.find({key:/教/}) // 查询key字段包含"教"字的文档 where key like '%教%'
21 db.col.find({key:/^教/}) // 查询key字段以"教"字开头的文档 where key like '%教'
22 db.col.find({key:/教$/}) // 查询key字段以"教"字结尾的文档 where key like '教%'
23
24 db.col.find({key:{$exists:1}}) // 不为0时匹配key属性存在的文档;为0时匹配key属性不存在的文档
25 db.col.find({key:{$mod:[5,0]}}) // 匹配key%5=0的文档
26 db.col.find({key: {$type : 2}}) // 匹配key字段中数据类型为string的文档
27 db.col.find({key: {$type : 'string'}}) // 匹配key字段中数据类型为string的文档
28
29 db.col.find().limit(10) // 取符合条件的前10条文档
30 db.col.find().limit(10).skip(10) // 跳过前10条文档,取第11-20条文档
31 db.col.find().sort({key:1}) //查询出的结果安装key字段升序排列
32 //skip(), limit(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()
33 //skip()和limit()可以用于少量数据的分页,但是对于大数据情况下,假设查询第100001条数据,这条数据的key值是:2399927
34 db.col.sort({key:1}).skip(100000).limit(10) //183ms,按key升序排列,跳过前100000条文档,取10条文档
35 db.col.find({key:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms,取大于key的文档,排序,取10条
36
37 db.col.find({$where:'this.likes>1000'}) // 匹配col集合中的likes>1000的文档,效率低
38 db.col.find({key:{$regex:正则表达式}}) // 匹配key属性中符合正则表达式的文档
1 mongo = new Mongo('localhost:27017') // 连接服务器
2 test = mongo.getDB('test') // 获取数据库test
3 // 配置数据库连接错误处理
4 // w:指定数据库错误连接写入的等级(-1 忽略网络错误、0 不要求进行写入确认、1 要求写入确认、2 要求已写入到副本集的主节点和从节点、majority 要求已经写入复制集绝大数服务器)
5 // wtimeout:等待时间,单位毫秒
6 // j:布尔值,如果为true,则写入请求将会等到日记同步完成后返回
7 // fsync:布尔值,如果为true,则写入请求将会等到日记fsync完成后返回
8 test.runCommand({getLastError:1,w:1,j:true,wtimeout:1000});
9 test.auth('DEV','123456') // 身份验证
10 numcoll = test.getCollection('numbers') // 获取集合numbers
11 numcoll.insert({num:30000}) // 插入数据
12 result = test.runCommand({getLastError:1})
13 if(result.err){
14 print(result.err)
15 }