其他分享
首页 > 其他分享> > Mongo

Mongo

作者:互联网

mongo

mogodb 是一种 nosql 数据库, 不同于关系型数据库。 它以 BJON 格式进行存储数据, 类似于json。 用coolection替代了mysql中的table, document替代了row, filed替代了column。
正如书中所讲, mongodb 是面向文档的数据库。 用一条记录能很好的解决层级问题, 这是mysql 不容易做到的。 而且其设计理念非常符合面向对象的思想, 对于程序员来说非常容易入门。 且数据存储是基于内存的, 从而达到高度读写。 但是它不支持事务, 其实也可想而知,
如果基于事务了, 他的速度可能就没那么快了。 所以 mongodb 也主要是以文档形式做缓存辅助 mysql。

1.key可以使用大多数utf-8的字符。

2.documnet就一个,而collection可以多个。

3.插入的键值对是默认有序的。

为什么使用?

对于关系型数据库,如果某个表关联东西太多了,导致需要建立特多的表。然后查询时,会造成频繁的join,减少效率。比如一篇博客,有多个标签,多条评论等。就这样需要建立两个表。而使用mongo,一个解决。

_id: POST_ID
   title: TITLE_OF_POST, 
   description: POST_DESCRIPTION,
   author: POST_BY,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES, 
   comments: [	
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
      }
   ]

优点:数据存储形式非常灵活宽松。而且key值每个document可以不同,即有的有,有的没有。JSON存数据,不需要转换。

java使用mongo

1.创建过程

ServerAddress serverAddress = new ServerAddress("192.168.248.128", 27017);
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
MongoCredential mc = MongoCredential.createScramSha1Credential("rwuser","sang","123".toCharArray());
credentialsList.add(mc);
MongoClientOptions options = MongoClientOptions.builder()
        //设置连接超时时间为10s
        .connectTimeout(1000*10)
        //设置最长等待时间为10s
        .maxWaitTime(1000*10)
        .build();
//创建客户端
MongoClient client = new MongoClient(serverAddress,credentialsList,options);
//获得数据库
MongoDatabase sang = client.getDatabase("sang");
//获得表名
c = sang.getCollection("c1");

1.查询find()

1.简单的查询使用Filters就足够了。(当然里面还有很多其他的过滤条件,也很强大)

collection.find(Filters.eq("_id","12312"));

复杂的查询,使用BasicDBObject,其实很容易发现如果是过滤某个固定的值直接put(key,value),而对于大于,小于,范围之类的过滤,需要put(key,new BasicDBObject())。注意类似范围查询,使用append()追加条件。

MongoCollection<Document> collection = mongoUtil.getCollection(driverCollectionName);
BasicDBObject queryObject = new BasicDBObject();
queryObject.put("datatime",new BasicDBObject("$gt",dateStart).append("lt",dateEnd));
queryObject.put("driverNo",new BasicDBObject("$ne",0));
queryObject.put("driverStatus",new BasicDBObject("$in",driverServingStatues()));
queryObject.put("driverType",1);
FindIterable<Document> documents = collection.find(queryObject);

上面的仅仅可以进行查询,但不能分组聚合查询,aggregate可以进行分组。

 AggregateIterable<Document> aggregateIterable = collection.aggregate(
                    Arrays.asList(Aggregates.match(basicDBObject),
							Aggregates.group("$driverNo"),
							Aggregates.sort(new BasicDBObject("count",-1))));
或者(下面这种方式比较全面)
BasicDBObject queryCond = new BasicDBObject();
 
  queryCond.put("patient_id", new BasicDBObject("$in", patientTransferDepRepository.getPatientIdsByDep(depId)));
 Date startDate = null;
        Date endDate = null;
        if (month == null) {
            //统计当前年份 全部数据
            startDate = DateUtils.getYearFirst(year);
            endDate = DateUtils.getYearLast(year);
        } else {
            //统计当前 年-月 数据
            //手术时间在当年当月第一天和最后一天时间范围内(工具类month从0开始,此处month是从1开始,所以month-1)
            startDate = DateUtils.getFirstDayOfMonth(year, month-1);
            endDate = DateUtils.getLastDayOfMonth(year, month-1);
        }
        queryCond.put("survey_time", new BasicDBObject("$gte", DateUtils.parseDate(DateUtils.formatDate(startDate)+ " 00:00:00")).append("$lte", DateUtils.parseDate(DateUtils.formatDate(endDate)+ " 23:59:59")));
        aggregateCondList.add(new BasicDBObject("$match", queryCond));
 
        //unwind
        aggregateCondList.add(new BasicDBObject("$unwind", "$data"));
        // ZDLB 改为 手术名称的code(SSMC)
        aggregateCondList.add(new BasicDBObject("$match", new BasicDBObject("data.key", "SSMC")));
 
        //聚合条件 取出该年该月 手术名称:相应次数
        aggregateCondList.add(new BasicDBObject("$group", new BasicDBObject("_id", "$data.value").append("count" , new BasicDBObject("$sum", 1))));
 
        //排序,取手术名称对应次数前8的
        aggregateCondList.add(new BasicDBObject("$sort", new BasicDBObject("count", -1)));
        aggregateCondList.add(new BasicDBObject("$limit", 8));
 
        Map<String, Integer> resultMap = new LinkedHashMap<>(8);
        //遍历结果集
        MongoCursor<Document> cursor = mdcMongoTemplate.getCollection(CDR_DATA).aggregate(aggregateCondList).iterator();
 

常用管道:

2.增加(insertOne,insertMany)

Document d1 = new Document();
d1.append("name", "三国演义").append("author", "罗贯中");
c.insertOne(d1);

List<Document> collections = new ArrayList<Document>();
Document d1 = new Document();
d1.append("name", "三国演义").append("author", "罗贯中");
collections.add(d1);
Document d2 = new Document();
d2.append("name", "红楼梦").append("author", "曹雪芹");
collections.add(d2);
c.insertMany(collections);

3.修改$set(没有这个key,就创建,有就覆盖),$inc(只适用用数字型,在原有基础上增加)

c.updateOne(Filters.eq("author", "罗贯中"), new Document("$set", new Document("name", "三国演义123")));

4.删除

c.deleteOne(Filters.eq("author", "罗贯中"));
c.deleteMany(Filters.eq("author", "罗贯中"));

标签:BasicDBObject,Mongo,add,key,put,new,append
来源: https://www.cnblogs.com/badribbit/p/13697703.html