MongoDB基础操作
插入
Insert:
db.getCollection('protest').insert({"name":"shaozhqi","sex":"男"})
查看插入数据:
Save:
现在有两条数据:
插入定义好的变量:
查看结果:
InsertOne:
db.getCollection('protest').insertOne({
"name":"花无缺",
"sex":"男"
})
查看结果:
insertMany:
db.getCollection('protest').insertMany([
{
"name":"花有缺",
"sex":"男"
},
{
"name":"小鱼儿",
"sex":"女"
}
]);
Sava与insert:
如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
验证:
当使用insert,并且指定花有缺的id,更新名称,执行报错主键冲突:
使用save则已是更新成功:
查看结果:
Update
默认更新一条:
写法一:
更新结果:
写法二:
更新结果:
写法三:
可以看到写法一的第一个set没有生效,修改如下:
查看执行结果:
疑问点sex我们设置的和之前的值一样不能区分是否变更,修改如下执行:
果然也有问题;
总结:如果要跟新多个字段只能用写法二的方式;
Update并且添加部门节点
查看结果:
修改设计部为产品部:
执行结果:
注:$这里是找到满足条件的子元素下标为name的字段
给我添加一辆宝马:
查看结果:
修改宝马为使用了三年:
不能这么做:
结果:
会导致对象覆盖,数据丢失。
应该这么做:
我们先还原数据:
db.getCollection('protest').update(
{"name":"邵志奇"},//条件
{$set:{"carinfo":{"name":"宝马X","price":"100万","use":"2年"}}}//要更新的字段
);
更新语句:
更新结果:
这里是单个对象,所有不适用$,使用后会报错
Update 跟新多条:
更新所有男性,分到A组:
可以看到只有一条数据更新:
multi
可以总结下update语法:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
修改语法如下:
查看更新结果:
也可简写:
跟新结果:
updateMany:
也可以用updateMany:这样就不用在写后面的参数了
更新结果:
当然updateOne是更新单个文档了
删除remove
默认删除满足条件的全部
remove已近过时:官方推荐使用deleteOne与deleteMany
删除如下数据:
语法:
查看结果:
可在语法上加1限制删除一条
Remove语法:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档。
writeConcern :(可选)抛出异常的级别。
deleteOne与deleteMany
语法类似remove,么有后面的限制条件了
查询Find
简单语法:
db.getCollection('protest').find({"_id":ObjectId("5af4f87d222a56e8480bd0e7")})
之前准备的全部数据:
Or:
查找A组或者C组的全部成员:
准备以下数据:
查询语句:
db.getCollection('protest').find({"age":{$gt:20},$or:[{"group":"A组"},{"group":"C组"}]})
年龄要大于20并且必须是A组或者C组的人。如果数据中确实对应的字段会被直接过滤掉
指定返回查询内容:
db.getCollection('protest').find({"age":{$gt:20},$or:[{"group":"A组"},{"group":"C组"}]},{name:1,by:1,sex:1,by:1})
db.getCollection('protest').find({"age":{$gt:20},$or:[{"group":"A组"},{"group":"C组"}]},{name:1,sex:1,by:1})
db.getCollection('protest').find({"name":"邵志奇"},{"deptIds":1})//查看部门
_id 键默认返回,需要主动指定 _id:0 才会隐藏
In:
db.getCollection('protest').find({"age":{$in:[20,19,24]}})
db.getCollection('protest').find({"age":{"$in":[20,19,24]}})
MongoDB常用操作符
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte
$ne ----------- not equal !=
$eq -------- equal =
Limit &&skip
返回满足条件一条记录数
db.getCollection('protest').find({}).limit(1)
跳过前四条满足条件的数据,所以就会直接找到第五条
db.getCollection('protest').find({}).skip(4)
排序
ongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列
语法示例:
按照age由大到小排序
db.getCollection('protest').find({}).sort({"age":-1})
多字段排序:
按照age降序,_id升序
db.getCollection('protest').find({}).sort({"age":-1,"_id":1})
注:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
索引
语法:db.COLLECTION_NAME.ensureIndex({KEY:1})
Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可
示例:
db.getCollection('protest').ensureIndex({"name":1})
复合索引:
db.getCollection('protest').ensureIndex({"name":1,"age":1})
其他参数:
示例:
db.getCollection('protest').ensureIndex({open: 1, close: 1}, {background: true})
聚合统计
http://www.runoob.com/mongodb/mongodb-aggregate.html
查看查询语句执行过程
db.getCollection('protest').find({"name":"邵志奇"}).explain()
记录
db.user1.update({"_id":"1"},{$set:{"name":"shao","age":"28"}})
// 需要更新那个数据,前面的大括号是条件,后面是要清空原有这条记录的所有字段(不包括_id)后要新存入的字段
//in语句
db.getCollection('dept').find({"_id":{$in:["33cce2d200da4626bbbbf5513594120c","6253ed4309e64a42b37005ebfb8edced"]}})
db.getCollection('label').remove({"canDelete":1})
db.getCollection('label').remove({"companyId":{$exists:true}})
db.label.save([{
"_id" : "1",
"chnName" : "部门",
"createTime" : NumberLong("1521705391609"),
"updateTime" : NumberLong("1521705391609"),
"showState" : NumberInt(1),
"canDelete" : NumberInt(0),
"canModify" : NumberInt(0)
},
{
"_id" : "2",
"chnName" : "邮箱",
"createTime" : NumberLong("1521705391610"),
"updateTime" : NumberLong("1521705391610"),
"showState" : NumberInt(1),
"canDelete" : NumberInt(0),
"canModify" : NumberInt(0)
}]
)
//这里save也可用insert替换,貌似insert是_id数据库原有值时用
插入单条数据
> var document = db.collection.insertOne({"a": 3})
> document
{
"acknowledged" : true,
"insertedId" : ObjectId("571a218011a82a1d94c02333")
}
插入多条数据
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("571a22a911a82a1d94c02337"),
ObjectId("571a22a911a82a1d94c02338")
]
}
orgId:a7e7e48cab1c4ee385e1cc78ad4fb009
passportId:312953f38a1b4a00a2c35f9050534f79
Query query=new Query(Criteria.where("companyId").is(companyId).and("groupId").ne(null).ne("").exists(true));
query.with(new Sort(Sort.Direction.DESC, "sort"));
return find(query);
db.getCollection('book_attr_templ').find({"org_id":"a7e7e48cab1c4ee385e1cc78ad4fb009","ekey":{$nin:["uo_name","uo_position","uo_phone","uo_email"]}})