当前位置: 首页 > news >正文

mongoDB学习笔记

1.大数据定义:

   数据量级大  byte kb MB GB TB PB ...

   数据种类多 数据维度  例如:人物画像

   数据处理速度快

   数据有价值

问题:①.存储 ?    ②.数据分析?    ③.高并发?

大数据应用领域: 电商(推荐) 广告栏位,交通,医疗

维度优化:

     ①X轴 服务水平拓展

     ②Y轴 业务垂直拆分  SOA

     ③Z轴  对使用群体分区(地域性)(多游戏)

==============================================

NoSQL :not noly sql 为什么?

  RDBMS:比较擅长 关系、事务 (约束)  快速 写 不擅长

                          基于磁盘存储 速度慢 高效 读写

                         大都数 数据库 都是 单点存储 不支持 水平拓展

  NoSQL:

                       1.schemaless 弱化表结构 没有表结构

                       2.in-memory 基于内存--redis

                       3.支持Cluster 集群 副本集合 分片

                       4.弱化事务 mongoDB不支持事务

                       5.支持脚本 mongodb javascript脚本 redisCluster ruby脚本

       

总结:NoSQL作为 RMDBS 补充 相辅相成。

==============================================

【MongoDB】:

     1.NoSQL数据库  不支持 事务

     2.MongoDB 单条记录 不得超过16M

     3.没有表结构 基于 BSON/json 存储

t_user   (RDBMS) 缺点 : 磁盘利用率低   IO利用率低

id   name  sex   info     ....

1    张三  null  逗你玩           记录(null值占用空间)

2    李四  null   null

3    王五  false  null

4    赵六  null   null

t_user[] (MongoDB)集合 没有表结构

[

  {id:1,name:"张三",info:"逗你玩"},

  {id:2,name:"李四"},

  {id:3,name:"王五",sex:false},

  {id:4,name:"赵六"},

  {id:5,name:"win7",hobbies:["看电视","打游戏"]},

  {id:6,name:"win8",hobbies:"敲代码"]}

]

MongoDB安装:

     1.将mongodb解压到/usr

     2.创建dbpath

        mkdir  -p /root/data/db

     3.在mongodb文件下启动mongodb

        ./bin/mongod --port 27017 --dbpath /root/data/db/ --journal

    

     4.新建窗口在mongodb文件下连接mongoDB

        ./bin/mongo --port 27017 --host 192.168.100.128

       

数据操作

   >show databases/dbs

   >use 数据库名  切换数据库

   >db  查看

   >db.dropDatabase() 删除数据库

   更多请查看 db.help();

    

  表:

   创建:db.createCollection("表名");

    

  查看:show tables/collections

     ...

    

任务:

  1.权威指南 2,3,4,5,6 章节

  2.了解mongo-java-driver javaAPI 不讲解

 ---------------------------------------------------------------------------------------------------------------------------- 

复习:

MongoDB的常见操作

1.创建表/collection

     (1).方式 :db.createCollection("collectionName");

     (2).隐式: db.'collectionName'.insert(document);

2.查看表: show collections/tables;

3.删除表:db.'collectionName'.drop();

添加:

    db.user.insert/save(json); 

    注意:如果数据表collection不存在就会创建。

    

     id   name   sex   birth ...

     1    zs     null  

     2    ww     男    1990-01-01

    

删除:

db.users.remove({})

根据条件进行删除的命令是:db.user.remove({age:31});  

更新:

      ①:MongoDB中没有更新,事实上是先删除在添加

       var jeo=db.user.findOne({});

      delete jeo.age;

      db.user.update(查询,更新的文档);

      ②修改器 $set ,$inc ,$unset

       db.users.update(query,{$set:{sex:true}}, { "upsert" : true, "multi" : true });

          //将name键删除

       db.users.update(query,{$unset:{name:true}}, { "upsert" : true, "multi" : true });

       附加说明:

        upsert:表示按照查询条件修改数据,如果没有匹配 执行 插入操作

        multi:表示 如果按照条件查询,查到多条记录后是否执行批量修改

       db.t_user.update({name:"win7"},{$inc:{age:1}},{ "upsert" : true, "multi" : true });

       数组的修改:

           db.t_user.update({ name: "win7" },{$set: {address:[]}},false,true);

           db.t_user.update({ name: "win7" },{$push: {address:"北京"}},false,true);

            一次更新多个数据

           db.t_user.update({ name: "win7" },{$push: {address:{$each:["北京","上海"]}}},false,true);

            避免重复插入

           db.user.update({ name: "zs" },{$addToSet: {address:{"$each":["北京","深圳","上地"]}}},false,true);

        删除指定元素 pop/pull

            db.user.update({ name: "zs" },{$pop: {address:1}},false,true);      //1表示弹出第一个元素      -1 表示弹出最后一个元素

            db.user.update({ name: "zs" },{$pull: {address:"北京"}},false,true);//删除指定元素

查询:

     1.查询一条

       document <—— db.user.findOne(查询条件);

     2.查询多条

     DBCursor <—— db.user.find();

                                 db.user.find({});

     3.条件查询

          (1)等值  ==       

                    db.user.find({name:"张三"});

                    db.user.find({name:{$eq:"张三"}});

          (2)且 AND      

                    db.user.find({name:"张三",age:18});

          (3)或 $or/$nor 

                   db.user.find({ "$or" : [{ "name" : "张三" }, { "age" : 20 }] });

                   db.user.find({ "$nor" : [{ "name" : "zhangsan" }, { "age" : 20 }] });

          (4) 不等值 > < <= >=  != !  $gt $lt $lte $gte $ne $not

                   ①db.user.find({ "age" : { "$gt" : 15, "$lt" : 30 } })

                   ②db.user.find({ "name" : { "$ne" : "zhangsan" } })

          (5) $in/$nin

                  db.user.find({ "id" : { "$in" : [1, 2, 3] } });

          (6) 数组查询

                  大小查询 $size

                   db.t_fruit.find({ "fruit" : { "$size" : 3 } });                        

                  下标查询

                   db.fruit.find({ "fruit.1" : "apple"});  

                  判断元素是否包含

                   db.fruit.find({ "fruit" :{"$all":["apple","banana"]}});  

          (7) $exists 判断是否有key  1/true表示存在 0/false 表示 不存在

                   db.user.find({"sex":{ "$exists" : 0 }});

          (8) 投影查询 0/false表示显示 1/true 表示不显示

                  db.t_user.find({},{"name":true});

          (9) 查询总记录数

                  db.t_user.count()

                  db.fruit.find({}).count(); 返回符合query查询结果

                  db.fruit.find({}).size();  返回实际的document个数

          (10) 数据分页 skip limit

                  db.fruit.find({ }).skip(1).limit(50);  //查询从第一条开始  查询50条记录

          (11) 排序

                  db.fruit.find({ }).sort({id:1});根据ID升序排列   1表示升序 -1 降序

          (12 )正则搜索

                  db.t_user.find({name:{$regex:"^张三$"}})

          (13)where 查询

                 db.user.find({ "$where" : "function aa(){

                         \r\n   print(this.name);

                         \r\n   if(this.name==\"张三\"){

                              \r\n      return true;\r\n  

                          }

                         \r\n   return false;

                          \r\n}"

                   })

                

                 db.t_user.find({name:{$eq:"张三"},$where:"(this.id<4)?false:true"})

======================================================

索引:

       db.users.ensureIndex({name:1},[options]) _id这个key mongo自动加入索引

       索引创建:db.users.ensureIndex({name:1}) 

                       db.t_user.ensureIndex({ "name" : 1 },{ "name" : "name_index" });

       查看索引:db.t_user.getIndexes();

       删除索引:db.t_user.dropIndex("name_index");  

       索引重建:db.users.reIndex()

       

       唯一索引:db.users.ensureIndex({"username" : 1}, {"unique" : true})//此时不可以为该域添加重复的值

       稀疏索引:db.users.ensureIndex({"name" : 1}, {"unique" : true, "sparse" : true})//主要对null值处理,允许多个null值存在,不认为违反unique

       TTL索引:db.users.ensureIndex({"last_modify" : 1}, {"expireAfterSecs" : 60})//定时清除过期数据 该索引必须建立在日期类型的field上

=====================================================      

MapReduce数据统计 计算:

db.students.insert({classid:1, age:14, name:'张三'});

db.students.insert({classid:1, age:12, name:'李四'});

db.students.insert({classid:2, age:16, name:'王五'});

db.students.insert({classid:2, age:9, name:'赵六'});

db.students.insert({classid:2, age:19, name:'win7'});

var  map=function() {

     emit(this.classid,{age:this.age,classid:this.classid,name:this.name})

}

var  reduce=function (key,values) {

        var x ={classid:-1,username:[],total:0};

          var total=0;

        values.forEach(function (v) {

               x.classid = v.classid;

               total++;

               x.username.push(v.name);

          });

          x .total=total;

        return x;

}

db.students.mapReduce( map, reduce,{out:"students_res"})

或者

var res = db.runCommand({

     mapreduce:"students",

     map:map,

     reduce:reduce,

     out:"students_res"

});

===========================================

*辅线 Mongo集群管理

    主从:

     Master/slave options (old; use replica sets instead):

          --master              master mode

          --slave               slave mode

          --source arg          when slave: specify master as <server:port>

          --only arg            when slave: specify a single database to replicate

          --slavedelay arg      specify delay (in seconds) to be used when applying master ops to slave

          --autoresync          automatically resync if slave data is stale

     查看主从状况:

       : rs.help();查看集群状态

    主机:./bin/mongod --port 27017 --dbpath /root/master  --journal  --master

    从机:./bin/mongod --port 27018 --dbpath /root/slave  --journal  --slave --source 192.168.100.128:27017 [--only zpark --autoresync]

    

     查看 slave 必须执行 rs.slaveOk() 允许在secondary节点上执行查询

     可以执行db.isMaster();查看当前服务状态。

     【缺点】:

         1.无法实现 自动的 故障转移 auto_faliover,如果主机宕机,需要关闭slave并且按照master模式启动

         2.无法解决海量数据存储

 -----------------------------------------------------------------------------------------------------------         

     副本集:(主从 升级版  仅仅解决的是第一问题 )

     1.在root文件夹创建repl1/repl2/repl3

       2.在mongodb文件下执行启动  

          ./bin/mongod --port 27017  --dbpath /root/repl1 --replSet  r1

          ./bin/mongod --port 27018  --dbpath /root/repl2 --replSet  r1

          ./bin/mongod --port 27019  --dbpath /root/repl3 --replSet  r1

     3.链接任意一台mongo

     var config = {

     _id:"r1",

     members:[

        {_id:0,host:"192.168.17.130:27017"},

        {_id:1,host:"192.168.17.130:27018"},

        {_id:2,host:"192.168.17.130:27019"}]

     }

     //初始化配置文件

           rs.initiate(config);

    

     rs.isMaster() / rs.status();

    

 ①.添加一个副本集

     ./bin/mongod --port 27010  --dbpath /root/repl4 --replSet  r1

     rs.add("192.168.100.128:27010");//添加一个节点

 ②.删除一个副本集:

     rs.remove("192.168.100.128:27010");

 ③.添加仲裁arbiter节点: 该节点只负责选举主节点不负责做数据的存储

     rs.add({_id:3,host:"192.168.17.130:27020",arbiterOnly:true});

       ==》等价rs.addArb("192.168.100.128:27010");

    

     阻止Secondary节点成为Primary 设置该节点的priority=0

        cfg=rs.config();

        cfg.members[1].priority=0

        rs.reconfig(cfg);

 ④.添加一个hidden节点 该节点不会成为primary以及被客户端引用

        cfg=rs.config();

        cfg.members[1].priority=0

        cfg.members[1].hidden=true

        rs.reconfig(cfg);

       

  ⑤.延迟复制节点(延迟节点的优先级必须为0和hidden节点是一样的) 一般都会设置hidden

        cfg=rs.config();

        cfg.members[1].priority=0

        cfg.members[1].slaveDelay=3600//单位是秒

        rs.reconfig(cfg);

   ⑥.SecondaryOnly节点

        Priority为0的节点永远不能成为主节点,所以设置Secondaryonly节点只需要将其priority设置为0.

  

   ⑦.设置Non-Voting节点:

        cfg=rs.conf();

        cfg.members[0].votes=0;

        rs.reconfig(cfg);

        注意:MongoDB的副本级别最大上限是17个,但最多只能有7个节点具有投票权。所以如果超过7个以后的节点,一般分配为Non-Voting

     副本集状态

         STARTUP:刚加入到复制集中,配置还未加载

         STARTUP2:配置已加载完,初始化状态

        RECOVERING:正在恢复,不适用读

        ARBITER: 仲裁者

        DOWN:节点不可到达

        UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂

        REMOVED:移除复制集

        ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态

        FATAL:出错。

        PRIMARY:主节点

        SECONDARY:备份节点

         

     【缺点】:海量数据存储        

====================================================          

    分片:配置服务器   路由服务器  shard服务器    

    ./bin/mongod  --port 27017 --dbpath /root/shard1  --journal --shardsvr

    ./bin/mongod  --port 27018 --dbpath /root/shard2  --journal --shardsvr

    

    ./bin/mongod  --port 27019 --dbpath /root/config --journal --configsvr

    ./bin/mongos --port  27020 --configdb  192.168.17.129:27019   

    

    --连接路由服务器

    mongo --port 27020

    use admin

     sh.addShard("192.168.100.128:27017");

     sh.addShard("192.168.100.128:27018");

    sh.enableSharding("zpark");//对zpark数据库分片

     //表示对_id 做分片处理(2选1)

     sh.shardCollection("zpark.t_user1", {"_id" : 1});

     sh.shardCollection("zpark.t_user2", {"_id": "hashed" })

     use zpark;

     插入测试数据

     for(var i=0; i<10000; i++){

          db.t_user1.insert({name:"user"+i, age:i, email:"zpark@163.com" })

    }

     for(var i=0; i<10000; i++){

          db.t_user2.insert({name:"user"+i, age:i, email:"zpark@163.com" })

    }

   查看状态:db.'collectionName'.stats()

   

==========================================================================

解释:

shard服务器个数决定数据库存储能力(副本集)--至少需要两个shard服务器 即生产环境下至少需要机器(2*3)台

config servers存储shard位置信息(3台)

路由服务器(1台) 伪装成一个MongoDB实例 接收用户发送过来的请求


最终版:副本集+分片 搭建mongo的集群

shard1

    ./bin/mongod --port 27017 --dbpath /root/data/shard11 --journal --replSet r1 --shardsvr

    ./bin/mongod --port 27018 --dbpath /root/data/shard12 --journal --replSet r1 --shardsvr

    ./bin/mongod --port 27019 --dbpath /root/data/shard13 --journal --replSet r1 --shardsvr

副本集跑起来

    连接任意一台mongo

     ./bin/mongo --port 27019 --host 192.168.17.130

    var config = {

     _id:"r1",

     members:[

       {_id:0,host:"192.168.17.130:27017"},

       {_id:1,host:"192.168.17.130:27018"},

       {_id:2,host:"192.168.17.130:27019"}]

     }

    rs.initiate(config);

shard2

    ./bin/mongod --port 27020 --dbpath /root/data/shard21 --journal --replSet r2 --shardsvr

    ./bin/mongod --port 27021 --dbpath /root/data/shard22 --journal --replSet r2 --shardsvr

    ./bin/mongod --port 27022 --dbpath /root/data/shard23 --journal --replSet r2 --shardsvr

副本集跑起来

    连接任意一台mongo

./bin/mongo --port 27022 --host 192.168.17.130

    var config = {

     _id:"r2",

     members:[

       {_id:0,host:"192.168.17.130:27020"},

       {_id:1,host:"192.168.17.130:27021"},

       {_id:2,host:"192.168.17.130:27022"}]

     }

    rs.initiate(config);

启动配置服务器:(目前版本3.0.6不支持将配置服务器搭建为副本集,最新版可以)

   ./bin/mongod  --port 27023 --dbpath /root/data/config1 --journal --configsvr

   ./bin/mongod  --port 27024 --dbpath /root/data/config2 --journal --configsvr

   ./bin/mongod  --port 27025 --dbpath /root/data/config3 --journal --configsvr

启动路由:

     //把三台配置服务器添加进路由服务器

   ./bin/mongos --port 27026 --configdb  192.168.17.130:27023,192.168.17.130:27024,192.168.17.130:27025

连接路由服务器

    ./bin/mongo --port 27026

    use admin

    sh.addShard("r1/192.168.17.130:27017,192.168.17.130:27018,192.168.17.130:27019");

    sh.addShard("r2/192.168.17.130:27020,192.168.17.130:27021,192.168.17.130:27022");

    sh.enableSharding("baizhi");//对baizhi数据库分片

    //表示对_id 做分片处理(方式2选1)

    sh.shardCollection("baizhi.t_user", {"_id" : 1});//先由一个副本集存放数据,快满时启用下个副本集

    sh.shardCollection("baizhi.t_address", {"_id": "hashed" });//副本集平均分布

插入测试数据

    for(var i=0; i<10000; i++){

        db.t_user .insert({name:"user"+i, age:i, email:"zpark@163.com" })

    }

    for(var i=0; i<10000; i++){

        db.t_address .insert({name:"user"+i, age:i, email:"zpark@163.com" })

    }

查看状态:db.user.stats() 

【注意】:集群搭建后,数据库建立索引需通过数据库,不能在代码中建立索引

=========================================================================

SpringData-MongoDB

①.导jar包

     Spring-jar、

     mongo-java-driver-2.14.3.jar

     spring-data-commons-1.12.5.RELEASE.jar

     spring-data-mongodb-1.9.5.RELEASE.jar

②. applicationContext.xml

​
<?xml version="1.0" encoding="UTF-8"?>< beans xmlns ="http://www.springframework.org/schema/beans"xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"xmlns:context ="http://www.springframework.org/schema/context"xmlns:aop ="http://www.springframework.org/schema/aop"xmlns:mvc ="http://www.springframework.org/schema/mvc"xmlns:tx= "http://www.springframework.org/schema/tx"xmlns:mongo ="http://www.springframework.org/schema/data/mongo"xsi:schemaLocation ="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://www.springframework.org/schema/data/mongohttp://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd" ><mongo:mongo host= "192.168.17.130" port= "27026" id ="mongo" /><bean id= "mongoTemplate" class ="org.springframework.data.mongodb.core.MongoTemplate" ><constructor-arg index= "0" ref = "mongo"/><constructor-arg index= "1" value = "baizhi"/></bean ></beans >​

③.实体类

package com.baizhi.entity;import java.io.Serializable;import java.util.List;import org.springframework.data.annotation.Id;import org.springframework.data.annotation.PersistenceConstructor;import org.springframework.data.mongodb.core.index.Indexed;import org.springframework.data.mongodb.core.mapping.DBRef;import org.springframework.data.mongodb.core.mapping.Document;import org.springframework.data.mongodb.core.mapping.Field;@Document(collection="t_user") //指明存入数据库后对应的文档public class User implements Serializable {@Id//默认情况下,mongo的主键只能是String、BigInteger、ObjectIdprivate String id;//给name字段设置索引,唯一、稀疏索引(针对null)@Indexed(name="name_index",unique=true,sparse=true) //搭建集群后不能在此处设置索引private String name;private int age;@Field(value="u_sex")//给数据库字段起别名private boolean sex;@DBRef(lazy=true)private City address;//使用到的时候,才会给该属性赋值@DBRef(lazy=true)   private List<OrderItem> orderItems;@PersistenceConstructor //数据库利用该构造方法将查询结果封装为对象 (要有set方法)public User(String name, int age, boolean sex) {super();this.name = name;this.age = age;this.sex = sex;}public User() {super();}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public City getAddress() {return address;}public void setAddress(City address) {this.address = address;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<OrderItem> getOrderItems() {return orderItems;}public void setOrderItems(List<OrderItem> orderItems) {this.orderItems = orderItems;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", address=" + address+ ", age=" + age + ", orderItems=" + orderItems + "]";}}

package com.baizhi.entity;import java.io.Serializable;import org.springframework.data.annotation.Id;import org.springframework.data.annotation.PersistenceConstructor;import org.springframework.data.mongodb.core.mapping.Document;@Document(collection="t_orderitem")public class OrderItem implements Serializable {@Idprivate String id;private String name;private int count;@PersistenceConstructorpublic OrderItem(String name, int count) {super();this.name = name;this.count = count;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}@Overridepublic String toString() {return "OrderItem [id=" + id + ", name=" + name + ", count=" + count+ "]";}}

④测试代码

package com.baizhi.test;import java.util.Arrays;import java.util.List;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.data.domain.Sort;import org.springframework.data.domain.Sort.Direction;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import com.baizhi.entity.City;import com.baizhi.entity.OrderItem;import com.baizhi.entity.User;import com.mongodb.Mongo;public class Demo {private Mongo mongo;private MongoTemplate mongoTemplate;@Beforepublic void before(){ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");mongo = (Mongo) ac.getBean("mongo");mongoTemplate = (MongoTemplate) ac.getBean("mongoTemplate");}@Testpublic void test8(){for (int i = 0; i < 10000; i++) {User user = new User("a"+i,i,true);user.setAddress(null);user.setOrderItems(null);mongoTemplate.insert(user);}}@Testpublic void test(){User user = new User("张三",18,true);mongoTemplate.insert(user);System.out.println(user);}@Testpublic void test1(){User user = mongoTemplate.findById("58c8e2696f5799eb36d4e83e", User.class);System.out.println(user);}@Testpublic void testSave(){double[] a = new double[]{1.1,2.2};User user=new User("马腾",18,false);City city = new City("北京",a);user.setAddress(city);List<OrderItem> orderItems=Arrays.asList(new OrderItem("hadoop权威指南", 1),new OrderItem("MongoDB权威指南",1));user.setOrderItems(orderItems);//先保存地址、订单项  再保存用户mongoTemplate.save(city);for (OrderItem orderItem : orderItems) {mongoTemplate.save(orderItem);}mongoTemplate.save(user);}@Testpublic void testQueryUserById(){User user = mongoTemplate.findById("58c8e5376f57cac13e322036", User.class);//获取的是代理对象@DBRef(lazy=true)List<OrderItem> orderItems = user.getOrderItems();for (OrderItem orderItem : orderItems) {System.out.println(orderItem);}}@Testpublic void testQueryAll(){List<User> users = mongoTemplate.findAll(User.class);for (User user : users) {System.out.println(user);}}@Testpublic void testQuery(){Query query = new Query();Criteria criteria = new Criteria("name");criteria.is("刘备");query.addCriteria(criteria);List<User> find = mongoTemplate.find(query, User.class);System.out.println(find);}@Testpublic void testQueryByPage(){Query query = new Query();query.skip(5);query.limit(10);List<User> list = mongoTemplate.find(query, User.class);for (User user : list) {System.out.println(user);}}@Testpublic void testQueryByOrder(){Query query = new Query();Sort sort = new Sort(Direction.ASC,"age");query.with(sort);List<User> list = mongoTemplate.find(query, User.class);for (User user : list) {System.out.println(user);}}@Testpublic void testRemove(){Query query = new Query();Criteria criteria = new Criteria("name");criteria.is("张三");query.addCriteria(criteria);mongoTemplate.remove(query, User.class);}@Testpublic void testUpdateMulit(){Query query = new Query();Criteria criteria = new Criteria("sex");criteria.is(false).and("age").gte(25);/*Criteria criteria = new Criteria("name");criteria.is("赵六");*/query.addCriteria(criteria);Update update = new Update();update.set("age", 31);mongoTemplate.upsert(query, update, User.class);}} 

相关文章:

mongoDB学习笔记

1.大数据定义&#xff1a; 数据量级大 byte kb MB GB TB PB ... 数据种类多 数据维度 例如&#xff1a;人物画像 数据处理速度快 数据有价值 问题&#xff1a;①.存储 &#xff1f; ②.数据分析&#xff1f; ③.高并发&#xff1f; 大数据应用领域: 电商&#xff08;推…...

快速融人,融资的共享模式,实体,线上皆可参考

有一种模式现在非常流行&#xff0c;它既能帮助商家快速收钱&#xff0c;又能帮助商家快速裂变更多客户&#xff0c;这个神奇的模式就是共享股东模式&#xff0c;现在很多老板都在用这个模式。 梦龙商业案例分析&#xff0c;带你了解商业背后的秘密 这个模式也适用于很多个行…...

纯干货版阿里巴巴国际站入门攻略

阿里巴巴国际站作为目前全球排名名列前茅的B2B电商平台&#xff0c;很多跨境电商卖家都很想入局。但是目前很多公司的国际站都没有专职运营的人员&#xff0c;只是靠外贸业务员操作&#xff0c;所以涉猎的都是比较浅的东西。今天龙哥就来讲讲如果想要深研这个平台的话&#xff…...

jQuery四、其他方法

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…...

2023年先进无人飞行系统国际会议(ICAUAS 2023) | IOP JPCS独立出版

会议简介 Brief Introduction 2023年先进无人飞行系统国际会议(ICAUAS 2023) 会议时间&#xff1a;2023年7月13日-16日 召开地点&#xff1a;中国哈尔滨&加拿大多伦多双会场 大会官网&#xff1a; ICAUAS 2023-2023 International Conference on Advanced Unmanned Aerial …...

2022蓝桥杯省赛——修剪灌木

问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开始向左修剪…...

Spring Boot Aop初接触

AOP&#xff08;面向切面编程&#xff09;&#xff0c;或多或少都听过一点。名字比较怪&#xff0c;切面&#xff0c;不容易理解&#xff0c;但其中真正含义&#xff0c;无非就是旁路控制&#xff0c;非侵入式编码之类。比如我想加个操作日志功能&#xff0c;利用AOP&#xff0…...

【创作赢红包】LeetCode:232. 用栈实现队列

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;232. 用栈实现队列 题目描述&#xff1a;请你仅使用两个栈实现先入先出队…...

Mybatis+Mysql 实现向下递归查询

介绍 说到递归查询&#xff0c;大家可以想到的技术实现方式主要如下几种&#xff1a; 1、各种主流应用开发语言本身通过算法实现 2、各种数据库引擎自身提供的算法实现 本文提到主要是针对第二种和第一种的结合 主要技术栈 1、ORM&#xff1a;Mybatis 2、DB&#xff1a;MyS…...

python@调用系统命令行@os.system@subprocess@标准输入输出@sys.stdin@sys.stdout@input@print

文章目录python调用系统命令行os.system标准输入输出sys.stdinsys.stdoutinputprint概要os.systemdemoswindows命令解释器ComSpecsubprocessrecommended&#x1f388;基本用法demos标准输入输出sys.stdininput()sys.stdin.inputinput()交互模式小结sys.stdoutsys.stdout.wirte(…...

手握数据智能密钥,诸葛智能打开数字化经营“三重门”

科技云报道原创。 如果说上世纪传统麦迪逊大街上的“广告狂人”吸金立足之本&#xff0c;还主要是基于“Big Idea”的话&#xff0c;那么在当下&#xff0c;数据正在成为企业营销和运营的金矿。 这是一个“人与机器共同进化”的时代&#xff0c;技术作为延伸人类感觉的媒介之…...

C语言可以实现各种滤波算法

C语言可以实现各种滤波算法&#xff0c;以下是一些常见的滤波算法&#xff1a; 均值滤波&#xff08;Mean Filter&#xff09;&#xff1a;将图像中每一个像素周围一定区域内的灰度值取平均值作为该像素的新灰度值&#xff0c;用于去除高斯噪声等随机噪声。 下面是一个简单的 C…...

使用Netty,当然也要了解它的连接闲置处理

连接闲置网络连接的闲置指的是当前网络连接处于空闲状态&#xff0c;即没有正在进行的数据传输或通信活动。当我们的某个连接不再发送请求或者接收响应的时候&#xff0c;这个连接就开始处于闲置状态。网络连接的闲置时间越长&#xff0c;说明该连接越不活跃。此时&#xff0c;…...

2、K-Planes

运行配置 主页&#xff1a;https://sarafridov.github.io/K-Planes/ 代码&#xff1a;https://github.com/sarafridov/K-Planes 预训练权重&#xff1a;https://drive.google.com/drive/folders/1zs_folzaCdv88y065wc6365uSRfsqITH Neural_3D_Video_Dataset&#xff1a;htt…...

张文海教授课题组在国际高水平期刊《Cerebral Cortex》发表研究成果

调节悲伤情绪对于维持伴侣间的浪漫关系至关重要。人际情绪调节策略包括情感参与&#xff08;AE&#xff09;和认知参与&#xff08;CE&#xff09;&#xff0c;这两种策略在浪漫关系中效用如何&#xff1f;它们是如何通过情感纽带调节伴侣情绪的&#xff1f;其背后的脑际神经互…...

ffmpeg4.1 源码学习之-转封装

前言 ffmpeg 的源码量非常的多&#xff0c;而且非常繁杂&#xff0c;非常多的函数&#xff0c;如果一个函数一个函数看的话要花费比较多的时间。所以本文通过跟踪ffmpeg转封装的过程来学习ffmpeg的源码具体转封装的命令&#xff1a;ffmpeg -i 1_cut.flv -c copy -f mp4 1.mp4在…...

ChatGPT写作文章-快速使用ChatGPT不用注册方式

如何更好地使用ChatGPT批量生成文章&#xff1a;详细教程 作为一款强大的文本生成器&#xff0c;ChatGPT可以帮助您快速、高效地批量生成文章。但如果您还不知道如何更好地使用ChatGPT&#xff0c;那么这篇详细的列表教程将会指导您如何使用它来生成高质量的文章&#xff0c;提…...

Nginx配置ip白名单(服务权限控制)

Nginx服务器权限控制&#xff1a;Nginx 是一款高性能的 HTTP 和反向代理服务器。它可以通过配置文件实现权限控制&#xff0c;从而限制或允许特定的 IP 地址、网络或用户访问指定的资源。这里是一些基本的 Nginx 权限控制方法&#xff1a; 1. 基于 IP 地址的访问控制 在 Ngin…...

Vue 核心(二)

文章目录Vue 核心&#xff08;二&#xff09;八、 绑定样式1、 class2、 style九、 条件渲染1、 渲染指令2、 使用示例十、 列表渲染1、 基本语法2、 key原理3、 列表过滤4、 列表排序5、 数组更新检测6、 大总结十一、 收集表单数据十二、 内置指令1、 v-text2、 v-html3、 v-…...

犯罪现场还原虚拟vr训练平台突破各种教学限制

在当今社会矛盾日益凸显、各式犯罪层出不穷的背景下&#xff0c;创新改革公安院校实战化教学方式&#xff0c;强化对基层公安队伍实战化应用型人才的供给能力具有重要性、紧迫性。 案件现场勘查是门技术活&#xff0c;如何让民警快速有效提升技能、服务实战? 常规刑侦专业现场…...

LeetCode 617. 合并二叉树 | C++语言版

LeetCode 617. 合并二叉树 | C语言版LeetCode 617. 合并二叉树题目描述解题思路思路一&#xff1a;使用递归代码实现运行结果参考文章&#xff1a;思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a;LeetCode 617. 合并二叉树 题目描述 题目地址&#xf…...

Python量化交易08——利用Tushare获取日K数据

总有同学问我要数据...很多第三方接口都能直接获取数据的&#xff0c;本次介绍怎么用Tushare库获取A股日k线行情的数据。 Tushare有两个版本&#xff0c;老版现在快弃用了。 新版的官网链接在这&#xff1a;Tushare数据 需要注册一个账号&#xff0c;然后改一下资料&#xff0…...

30张精美可视化大屏,无需代码直接套用,解决你95%的大屏需求!

通常制作可视化大屏&#xff0c;一般有两种方式 代码开发&#xff1a;写代码调用数据和图表库&#xff0c;比如写JSEcharts &#xff1b; 可视化工具&#xff1a;用现成的数据可视化工具 前者简单直接&#xff0c;直接写代码就完事。但对于大部分人来说门槛较高&#xff0c;维…...

TCP网络事件模型的封装1.0

TCP网络模型的封装 最近学习了TCP网络模型的封装&#xff0c;其中运用的封装技术个人感觉有点绕 在反复读代码、做思维导图下初步理解了这套封装模型&#xff0c;不禁感叹原来代码还能这样写&#xff1f;神奇&#xff01; 为此将源码分享出来并将流程图画出&#xff0c;方便…...

NC271.二叉搜索树的后序遍历序列

文章目录一、题目描述二、示例三、主要思路一、题目描述 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 提示&#xff1a; 1.二叉搜索树是指父亲节点大于左子树中…...

研究fastdds v2.8.0 1之 基础模块

阅读 dds 协议 1.4 版本 &#xff0c; 结合fastdds 2.8 的代码理解dds。 Entity 理解 DCPS基础设施模块由以下类组成&#xff1a; Entity DomainEntity QosPolicy Listener Status WaitSet Condition GuardCondition StatusCondition1、Entity 是所有DCPS 对象的基础类 virt…...

ElasticSearch系列 - SpringBoot整合ES:精确值查询 term

文章目录01. ElasticSearch term 查询&#xff1f;02. ElasticSearch term 查询数值型数据&#xff1f;03. ElasticSearch term 查询字符串类型数据&#xff1f;04. ElasticSearch term 查询日期型数据&#xff1f;05. ElasticSearch term 查询日期型数据的注意事项&#xff1f…...

关于async/await、promise和setTimeout执行顺序

关于async/await、promise和setTimeout执行顺序 async function async1() {console.log(async1 start);await async2();console.log(asnyc1 end); } async function async2() {console.log(async2); } console.log(script start); setTimeout(() > {console.log(setTimeOut…...

2023-03-31:如何计算字符串中不同的非空回文子序列个数?

2023-03-31&#xff1a;给定一个字符串 s&#xff0c;返回 s 中不同的非空 回文子序列 个数&#xff0c; 通过从 s 中删除 0 个或多个字符来获得子序列。 如果一个字符序列与它反转后的字符序列一致&#xff0c;那么它是 回文字符序列。 如果有某个 i , 满足 ai ! bi &#xff…...

D. The Number of Imposters(二分图染色)

Problem - D - Codeforces Theofanis开始玩名为“Among them”的新网络游戏。然而&#xff0c;他总是和塞浦路斯球员一起踢球&#xff0c;他们都有一个相同的名字:“安德烈亚斯”(塞浦路斯最常见的名字)。在每个游戏中&#xff0c;Theofanis和n个其他玩家一起玩。因为它们都有相…...

图片太大怎么改小kb?简单的图片压缩方法分享

平时当我们在朋友圈分享一些有趣的照片或者使用图片素材进行上传的时候&#xff0c;经常遇到图片大小kb超出平台限制的情况&#xff0c;这时就无法正常上传了&#xff0c;遇到这种情况我们就需要想办法降低图片大小kb&#xff0c;那么有什么办法能够压缩图片大小呢&#xff1f;…...

【python-leecode刷题】动态规划类问题----以53. 最大子数组和为例

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…...

Idea常用快捷键设置

设置来源于尚硅谷宋红康老师 第1组&#xff1a;通用型 说明 快捷键 复制代码-copy ctrl c 粘贴-paste ctrl v 剪切-cut ctrl x 撤销-undo ctrl z 反撤销-redo ctrl shift z 保存-save all ctrl s 全选-select all ctrl a 第2组&#xff1a;提高编写速度&#xff08;上…...

【新2023Q2模拟题JAVA】华为OD机试 - 分苹果

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:分苹果 题目 AB两个人把苹果…...

【博学谷学习记录】超强总结,用心分享丨人工智能 自然语言处理 BERT、GPT、ELMO对比学习简记

目录三模型架构BERTGPTELMO三者差异点三模型架构 BERT 优点 在11个NLP任务上取得SOAT成绩.利用了Transformer的并行化能力以及长语句捕捉语义依赖和结构依赖.BERT实现了双向Transformer并为后续的微调任务留出足够的空间. 缺点 BERT模型太大, 太慢.BERT模型中的中文模型是以…...

【嵌入式Bluetooth应用开发笔记】第四篇:初探蓝牙HOST及应用开发(持续更新ing)

概念 蓝牙HOST(Bluetooth Host)是指能够连接到其他蓝牙设备并控制它们的设备。在蓝牙技术中,通常有两种类型的设备:蓝牙HOST和蓝牙SLAVE。蓝牙HOST通常是指拥有控制权的设备,它可以主动连接其他蓝牙设备并向其发送命令。相反,蓝牙SLAVE则是指被动连接的设备,它接受来自…...

GORM 基础 -- CRUD 接口

1、Create 1.1 创建纪录 user : User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}result : db.Create(&user) // pass pointer of data to Createuser.ID // 回填插入数据的主键 result.Error // 返回的 error 信息 result.RowsAffect…...

为什么0代码自动化测试越来越受欢迎?一文2000字解析

目录 01、什么是零代码自动化测试 02、为什么零代码自动化测试越来越受欢迎 03、有代码和零代码自动化有什么区别 04、零代码自动化测试可以帮助你做什么 05、零代码自动化测试方法&#xff1a;NLP&#xff08;自然语言处理&#xff09; 06、为什么我们需要零代码自动化测…...

cleanmymac最新2023版 mac清理软件CleanMyMac X4.12.5 中文版功能介绍

CleanMyMac X4.12.5 中文版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。cleanmymac x个人认为X代表界面上的最大升级&#xff0c;功能方面有更多增加&#xff0c;与最新macOS系统更加兼容&#xff0c;流畅地与系统性能更加…...

pyhon部署注意事项

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…...

宣城x移动云,打造“城市级物联感知平台”

随着新一代信息技术与城市现代化的深度融合&#xff0c;智慧城市建设的重要性也愈发凸显。而在智慧城市建设中&#xff0c;物联网感知体系扮演着中枢神经系统的角色。 安徽宣城紧抓长三角城市群一体化发展机遇&#xff0c;为构建“数字宣城”建设发展新模式&#xff0c;携手移…...

英伟达Jetson NX套件刷机,配置Ubuntu20。

0. 前言 人并没有眼见得那么光鲜亮丽&#xff0c;博客也是。 今天推荐一本书《一百个人的十年》&#xff0c;没错就是我们的那十年&#xff08;60年代&#xff09;。写得很真实&#xff0c;牛棚猪圈&#xff0c;确实如此。 1. SdkManager安装 官网下载。 打开终端 执行命令sud…...

Vue计算属性

计算属性 ​ 计算属性的重点突出在属性两个字上(属性是名词)&#xff0c;首先它是个属性其次这个属性有计算的能力(计算是动词)&#xff0c;这里的计算就是个函数;简单点说&#xff0c;它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性)&#xff0c;仅此而已…...

代码随想录刷题-字符串-反转字符串

文章目录反转字符串习题双指针swap 的两种方式反转字符串 本节对应代码随想录中&#xff1a;代码随想录&#xff0c;讲解视频&#xff1a;字符串基础操作&#xff01; | LeetCode&#xff1a;344.反转字符串_哔哩哔哩_bilibili 习题 题目链接&#xff1a;344. 反转字符串 - …...

14-链表练习-剑指 Offer II 021. 删除链表的倒数第 n 个结点

题目 给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&…...

用Java解决华为OD机试考题,真的高效,真的强,来吧,清单奉上,祝你上岸

华为 OD 机试题最新&#xff08;Java&#xff09;清单&#xff08;机试题库还在逐日更新&#xff09; 题库目录 直接在本页使用 CtrlF&#xff0c;输入题目名称就可以进行检索。 序号文章分值1【华为OD机试真题JAVA】快递装载问题_国服第二切图仔的博客-CSDN博客1002【华为…...

【Stable Diffusion】Stable Diffusion免安装在线部署教程

一、开启Google Colab网址 官网&#xff1a;https://colab.research.google.com/ 点击添加代码&#xff1a; 二、执行如下代码指令 !pip install --upgrade fastapi0.90.1 !git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui !git clone https://github.…...

Jetson设备如何接调试串口工具查看内核打印信息

方便小白使用如下教程。 一、认识USB转串口调试工具转接小板 和硬件连接方式 如图&#xff0c;是一款USB TO TTL转换板&#xff0c;这款小板支持3种供电模式&#xff1a;对外输出5V、对外输出3.3V和由外部供电。正面有一个跳帽&#xff0c;跳帽跳到3V3&#xff0c;小板由US…...

一直被低估的美图,正悄悄成为AIGC领跑者

【潮汐商业评论/原创】 也许多年之后再回望历史&#xff0c;2023年将被视为标志性的一年。它不仅是疫情之后的复苏之年&#xff0c;更是人工智能在中国乃至全球迎来爆发的一年。 从来没有这样的景象——在2023年的前3个月&#xff0c;全球互联网被AIGC话题“刷屏”&#xff0…...

JAVA开发与运维(JavaWeb测试环境搭建)

本例子测试环境搭建在腾讯云平台之上。 系统架构&#xff1a; 微服务EurekaApollogateWayredisrocketMqOSSsparkETLmysqlpgsqlclickHouseSLB. 首先需要申请的云资源。 业务用途CPUMEMDisk数量云产品规格服务器应用服务&#xff08;部署微服务&#xff09;4核8G500G1CVMS6.L…...