🥭mongodb学习

2021-07-19 Views mongoDB | NoSql | 数据库805字4 min read

docker中挂载mongodb

docker run -p 27017:27017 -v /data/mongo:/data/db --name mongodb -d mongo

特别注意:挂载的/data/db目录必须要有,并确保该目录有

mkdir -p /data/p

💨Quick Start

数据库操作

# 查看当前指向数据库
db

# CRUD
##  插入(MAX_SIZE = 48MBp)
db.good.insert(<文档>)
### 若想插入多条数据?(插入集合)
post1 = {"title":"blog1","date":new Date()}
post2 = {"title":"blog2","date":new Date()}
post3 = {"title":"blog3","date":new Date()}
db.good.insert([
post1,post2,post3
])

## 查询
### 查一个
db.good.findOne()
### find会显示至多20条数据

## 更新
### 增加字段(增加评论字段)
post.comments = []
### 更新数据
db.good.update({title:"my blog update"},post)

## 删除
db.good.remove({title:"my blog update"})

Java开发中使用

/*
* 对于mongodb-java-driver 3.7 以下的版本适用
*/

/**********************无验证版本**********************/
// new一个mongoClient
MongoClient mongoClient = new MongoClient("<host>",<port>);

//获取mongo数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("<database_name>");

/**********************有验证版本**********************/
ServerAddress serverAddress = new ServerAddress("<host>",27017);
List<ServerAddress> addressList = new ArrayList<>();
addressList.add(serverAddress);

//mongo验证
MongoCredential credential = MongoCredential.createScramSha1Credential("username","databaseName","password".toCharArray());

List<MongoCredential> credentials = new ArrayList<>();

credentials.add(credential);

MongoClient mongoClient = new MongoClient(addressList,credentials);

MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
System.out.println("Connect successfully");

/*
* 对于mongodb-java-driver 3.7 以上的版本适用
* 仅仅是这两处的不同
*/

// 连接到 mongodb 服务
mongoClient = MongoClients.create(
    MongoClientSettings.builder()
    .applyToClusterSettings(builder ->
                            builder.hosts(Arrays.asList(new ServerAddress("192.168.216.131"))))
    .build());

// 连接到数据库
mongoDatabase = mongoClient.getDatabase("testdb");

Tips:

对于mongo3.7以上的版本,java中对mongo的API完全不同

若是对 3.7 以上的版本采用新API,那么就会报nullpoint错误

主要是要区分 com.mongodb.MongoClient(类) 和 com.mongodb.client.MongoClient 是接口。

报 because there was a socket exception raised by this connection. 错误是因为数据量太大,读不出来

还有可能就是未授权yml配置需要采用 authentication-database: admin 进行授权

参考资料:

mongoDB JVM Drivers(4.2)文档

mongo-java-API文档

关于 socket exception rised 错误

采用 authentication-database: admin 进行授权问题( 视频 )

mongo索引查询

    /**
     * @title getTxByAddress
     * @description 通过地址找交易
     * @author DiomChen
     * @updateTime 2021/7/12 17:55
     * @throws
     * @测试数据:
     *      17yYyafrfiaaVJGcaeQdpAeHdcBQSKAuLD
     */
    @Test
    public void getTxByAddress(){
        Query query = new Query(Criteria
                .where("address").is("17yYyafrfiaaVJGcaeQdpAeHdcBQSKAuLD"));
        List<Addresstxs> addresstxsList = mongoTemplate.find(query,Addresstxs.class);
        String txid = addresstxsList.get(0).getTxid();
        Query query1 = new Query(Criteria
        .where("txid").is(txid));
        System.out.println(mongoTemplate.find(query1,Transactions.class));
    }

无索引

image-20210712185013822

以address建立索引

image-20210712191003692

参考链接:

SpringBoot2使用mongoTemplate创建集合并添加索引

MongoDB索引管理-索引的创建、查看、删除

在MongoDB中执行查询与创建索引

基本内容

  • 文档:对应关系型数据库中的行,但是内部有顺序
  • 集合:对应关系型数据库中的表,是有多个文档组成,对于文档内部不关心(动态模式)

数据类型

  • null :{"x" : null}
  • 布尔:{"x" : false}
  • 数值:{"x":3}
  • 字符串:{"x":"str"}
  • 日期:{"x":new Date()}
  • 正则表达式:{"x":/foobar/i}
  • 数组:{"x":["a","b","c"]}
  • 内嵌文档:{"x":{"foo","bar"}}
  • 对象id:{"x":ObjectId()}
  • 二进制数据:{"x":}
  • 代码:{"x":function(){/* */}}
EOF