1.获取安装包
wget https://fastdl.mongodb.org/linux/m2ongodb-linux-x86_64-rhel70-4.4.2.tgz
2.进行解压
tar -xvzf mongodb-linux-x86_64-rhel70-4.4.2.tgz
3.添加到系统执行路径( ~/.bashrc)
export PATH=$PATH:<你机器MongoDB bin目录,如:/usr/local/mongodb/mongodb-linux-x86_64-rhel70-4.4.2/bin>
执行 source ~/.bashrc,使其生效
4.创建数据目录
mkdir -p /data/db # 这个路径是MongoDB默认的数据存放路径
5.启动MongoDB服务
mongod # 如果你不希望使用的默认数据目录可以通过 添加 --dbpath 参数指定路径
前台启动则需要开启另一个窗口进行链接,所以我们使用后台启动
a.后台启动必须创建日志目录,在db文件夹下创建logpath文件夹存放目录
mkdir logpath
b.创建日志文件output.out
touch output.out
c.后台启动
mongod --fork --logpath /data/db/logpath/output.out
出现如下画面启动成功
查看日志
db.集合.insertOne() // 添加单个文档
db.集合.insertMany([{},{}]) // 批量添加文档
db.集合.insert() // 添加单个文档
db.inventory.insertMany([ { item: "journal", qty: 25, status: "A", size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] }, { item: "notebook", qty: 50, status: "A", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] }, { item: "paper", qty: 10, status: "D", size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] }, { item: "planner", qty: 0, status: "D", size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] }, { item: "postcard", qty: 45, status: "A", size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] } ]);
上述操作返回一个包含确认指示符的文档和一个包含每个成功插入文档的_id的数组
db.inventory.find({}) 查询所有的文档
db.inventory.find({}).pretty() 返回格式化后的文档
1. 精准等值查询
db.inventory.find( { status: "D" } );
db.inventory.find( { qty: 0 } );
2. 多条件查询
db.inventory.find( { qty: 0, status: "D" } );
3. 嵌套对象精准查询
db.inventory.find( { "size.uom": "in" } );
4. 返回指定字段
db.inventory.find( { }, { item: 1, status: 1 } );
默认会返回_id 字段, 同样可以通过指定 _id:0 ,不返回_id 字段
5. 条件查询 and
db.inventory.find({$and:[{"qty":0},{"status":"A"}]}).pretty();
6. 条件查询 or
db.inventory.find({$or:[{"qty":0},{"status":"A"}]}).pretty();
Mongo查询条件和SQL查询对照表
SQL | MQL |
a<>1 或者 a!=1 | { a : {$ne: 1}} |
a>1 | { a: {$gt:1}} |
a>=1 | { a: {$gte:1}} |
a<1 | { a: {$lt:1}} |
a<=1 | { a: { $lte:1}} |
in | { a: { $in:[ x, y, z]}} |
not in | { a: { $nin:[ x, y, z]}} |
a is null | { a: { $exists: false }} |
db.demeDoc.insert( { _id: { product_name: 1, product_type: 2}, supplierId:" 001", create_Time: new Date() } )
_id中添加多个字段就是复合主键。复合主键是有顺序的。
$not : 匹配筛选条件不成立的文档 $and : 匹配多个筛选条件同时满足的文档 $or : 匹配至少一个筛选条件成立的文档 $nor : 匹配多个筛选条件全部不满足的文档
1.$not
{ field: { $not : { operator-expression} }}
db.members.find({points: { $not: { $lt: 100}}} );
2.$and
{ $and : [ condition expression1 , condition expression2 ..... ]}
昵称等于曹操, 积分大于 1000 的文档 db.members.find({$and : [ {nickName:{ $eq : "曹操"}}, {points:{ $gt:1000}}]});
当作用在不同的字段上时 可以省略 $and
db.members.find({nickName:{ $eq : "曹操"}, points:{ $gt:1000}});
当作用在同一个字段上面时可以简化为
db.members.find({points:{ $gte:1000, $lte:2000}});
3.$or
{ $or :{ condition1, condition2, condition3,... }}
db.members.find( {$or : [ {nickName:{ $eq : "刘备"}}, {points:{ $gt:1000}}]} );
db.collection.find( 查询条件, 投影设置)
1标识返回,0标识不返回,非主键字段不能同时混选0或1
db.members.find({},{_id:0 ,nickName:1, points:1})
db.members.find({},{_id:0 ,nickName:1, points:0})
插入一条数据
db.members.insertOne( { _id: {uid:3,accountType: "qq"}, nickName:"张飞", points:1200, address:[ {address:"xxx",post_no:0000}, {address:"yyyyy",post_no:0002} ]} );
返回数组的第一个元素
db.members.find( {}, {_id:0, nickName:1, points:1, address: {$slice:1} });
slice: 值
1: 数组第一个元素
-1:最后一个元素
-2:最后两个元素
slice[ 1,2 ] : skip, limit 对应的关系
添加一组数据
db.members.insertOne( { _id: {uid:4,accountType: "qq"}, nickName:"张三", points:1200, tag:["student","00","IT"]} );
查询tag数组中第一个匹配"00" 的元素
db.members.find( {}, {_id:0, nickName:1, points:1, tag: { $elemMatch: {$eq: "00" } } });
updateOne/updateMany 方法要求更新条件部分必须具有以下之一,否则将报错
$set 给符合条件的文档新增一个字段,有该字段则修改其值
$unset 给符合条件的文档,删除一个字段
$push: 增加一个对象到数组底部
$pop:从数组底部删除一个对象
$pull:如果匹配指定的值,从数组中删除相应的对象
$pullAll:如果匹配任意的值,从数据中删除相应的对象
$addToSet:如果不存在则增加一个值到数组
更新操作
db.collection.update( <query>,<update>,<options>)
<query> 定义了更新时的筛选条件
<update> 文档提供了更新内容
<options> 声明了一些更新操作的参数
插入两条数据演示:
db.userInfo.insert([ { name:"zhansan", tag:["90","Programmer","PhotoGrapher"] }, { name:"lisi", tag:["90","Accountant","PhotoGrapher"] }]);
将tag 中有90 的文档,增加一个字段: flag: 1
db.userInfo.updateMany( {tag:"90"}, {$set:{flag:1}} );
flag字段现已有,在更新则为更新操作
db.userInfo.updateOne( {tag:"90"}, {$set:{flag:2}} );
默认只会更新第一个匹配的值,可以通过设置 options {multi: true} 设置匹配多个文档并更新
db.doc.update( {name:"zhangsan"}, {$set:{ flag: 1 }}, {multi:true} );
更新操作符
$set 更新或新增字段
$unset删除字段
$rename 重命名字段
$inc 加减字段值
$mul 相乘字段值
$min 采用最小值
$max 次用最大值
db.collection.remove(<query>,<options>)
默认情况下,会删除所有满足条件的文档, 可以设定参数 { justOne:true},只会删除满足添加的第一条文档
db.collection.drop( { writeConcern:<doc>})
<doc> 定义了本次删除集合操作的安全写级别
db.collection.remove 只会删除所有的文档,直接使用remve删除所有文档效率比较低,可以使用 drop 删除集合,才重新创建集合以及索引。