美文网首页
MongoDB入门

MongoDB入门

作者: 东南枝下 | 来源:发表于2022-01-05 22:00 被阅读0次

mongoDB中文文档:https://docs.mongoing.com/
mongoDB官方文档:https://docs.mongodb.com/v5.0/

docker 安装 MongoDB

学习一个工具的时候不应该在安装上花费太多时间,所以采用docker安装

docker pull mongo
 
# --auth:需要密码才能访问容器服务。
docker run -itd --name mongo -p 27017:27017 mongo --auth
 
# 进入容器
docker exec -it mongo mongo admin
 
# 创建一个名为 admin,密码为 123456 的用户。
>  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')

简单使用

查看版本

> db.version()
5.0.5

查看/创建数据库

# use 命令切换数据库,当数据库不存在时会新建数据库,所以可以切换到不存在的数据库
> use myDB
switched to db myDB
> use myDB2
switched to db myDB2
# 查看当前所在数据库
> db
myDB2
# 展示所有数据库
> show dbs 
admin   0.000GB
config  0.000GB
local   0.000GB
> 

查看/创建集合

MongoDB将文档存储在集合中。集合类似于关系数据库中的表。

# 如果不存在集合,则在您第一次为该集合存储数据/创建索引时,MongoDB会创建该集合
> db.myCollection.insertOne({x:1})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("61d52c33875bb4c2408d6e53")
}
> db.myCollection2.createIndex({x:1})
{
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "createdCollectionAutomatically" : true,
    "ok" : 1
}
# 查看该库下所有集合
> show collections
myCollection
myCollection2

简单crud

插入文档

db.collection.insertOne() 将单个文档插入到集合中
db.collection.insertMany() 将多个文件插入集合中。
db.collection.insert() 将单个文档或多个文档插入到集合中。

> db.myCollection.insertOne({x:1})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("61d58543875bb4c2408d6e54")
}

> db.myCollection.insertMany([{name:"alix",age:15},{name:"jenson",age:18}])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("61d585e4875bb4c2408d6e55"),
        ObjectId("61d585e4875bb4c2408d6e56")
    ]
}

> db.myCollection.insert({name:"angila",age:15})
WriteResult({ "nInserted" : 1 })

> db.myCollection.insert([{name:"blus",age:15},{name:"zhangSang",age:18}])
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 2,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

查询文档

  • db.collection.find( {} )

检索集合中的所有文档 db.collection.find( {} )

> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1 }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }

从查询结果可以看出,如果文档未指定_id字段,则MongoDB将具有ObjectId值的_id字段添加到新文档中
重新尝试一下插入,此时加入_id,结果如下

# 插入一条已有_id的数据,报错`E11000 duplicate key`
> db.myCollection.insertOne({_id:ObjectId("61d52c33875bb4c2408d6e53"),x:1})
WriteError({
    "index" : 0,
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: myDB.myCollection index: _id_ dup key: { _id: ObjectId('61d52c33875bb4c2408d6e53') }",
    "op" : {
        "_id" : ObjectId("61d52c33875bb4c2408d6e53"),
        "x" : 1
    }
}) :
WriteError({
    "index" : 0,
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: myDB.myCollection index: _id_ dup key: { _id: ObjectId('61d52c33875bb4c2408d6e53') }",
    "op" : {
        "_id" : ObjectId("61d52c33875bb4c2408d6e53"),
        "x" : 1
    }
})
WriteError@src/mongo/shell/bulk_api.js:465:48
mergeBatchResults@src/mongo/shell/bulk_api.js:871:49
executeBatch@src/mongo/shell/bulk_api.js:940:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1182:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:264:9
@(shell):1:1

# 指定_id不同就可以插入
> db.myCollection.insertOne({_id:ObjectId("61d52c33875bb4c2408d6e60"),x:1})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("61d52c33875bb4c2408d6e60")
}
> 
# 等值查询
> db.myCollection.find( {x:1} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1 }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1 }
> 
  • db.collection.find({ <field1>: <value1>, ... })
    等值查询
> db.myCollection.find( {name:"alix",age:15} )
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
  • db.collection.find({ <field1>: { <operator1>: <value1> }, ... })
    等值查询单一字段多值
> db.myCollection.find( {name:"alix",age:{$in:[15,18]}} )
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
>
>
> db.myCollection.find( {age:{$in:[15,18]}} )
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }

查询语句中$in就是查询操作符,更多查询操作符参考官方文档:https://docs.mongodb.com/manual/reference/operator/query/

更新文档

db.collection.updateOne(<filter>,<update>,<options>)
db.collection.updateMany(<filter>,<update>,<options>)
db.collection.replaceOne(<filter>,<update>,<options>)

和查询一样,<options>就是提供的更新操作符,更多操作法参考官方文档:https://docs.mongodb.com/manual/reference/operator/update/

  • updateOne
    真就只更新一个
> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1 }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1 }
> 
> 
> db.myCollection.updateOne({x:1},{$set:{teacher:"gaoSeng",class:"三年二班"},$currentDate:{lastModified:true}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> 
> 
> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:34:32.990Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1 }
> 
  • updateMany
> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:34:32.990Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 15 }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1 }
> 
> 
> db.myCollection.updateMany({x:1},{$set:{teacher:"gaoSeng",class:"三年二班"},$currentDate:{lastModified:true}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> 
>
> db.myCollection.updateMany({name:"alix"},{$set:{age:30},$currentDate:{lastModified:true}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
>
> 
> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 30, "lastModified" : ISODate("2022-01-05T12:38:54.530Z") }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
> 
  • replaceOne 替换文档
> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 30, "lastModified" : ISODate("2022-01-05T12:38:54.530Z") }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
> 
> 
> db.myCollection.replaceOne({x:1},{name:"x1",age:11})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> 
> 
# 替换了第一个文档,可以发现_id没有变化
> db.myCollection.find( {} )
{ "_id" : ObjectId("61d52c33875bb4c2408d6e53"), "name" : "x1", "age" : 11 }
{ "_id" : ObjectId("61d58543875bb4c2408d6e54"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e55"), "name" : "alix", "age" : 30, "lastModified" : ISODate("2022-01-05T12:38:54.530Z") }
{ "_id" : ObjectId("61d585e4875bb4c2408d6e56"), "name" : "jenson", "age" : 18 }
{ "_id" : ObjectId("61d58605875bb4c2408d6e57"), "name" : "angila", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e58"), "name" : "blus", "age" : 15 }
{ "_id" : ObjectId("61d58620875bb4c2408d6e59"), "name" : "zhangSang", "age" : 18 }
{ "_id" : ObjectId("61d52c33875bb4c2408d6e60"), "x" : 1, "class" : "三年二班", "lastModified" : ISODate("2022-01-05T12:36:17.008Z"), "teacher" : "gaoSeng" }
>
>
# 没有replaceMany这个函数
> db.myCollection.replaceMany({x:1},{class:"三年二班",age:12})
uncaught exception: TypeError: db.myCollection.replaceMany is not a function :
@(shell):1:1
> 

更多复杂crud其实官方文档很详细,需要时再找

springBoot使用MongoDB

参考博客:https://www.cnblogs.com/superjie/p/9722147.html

  1. 依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
  1. application.yml配置文件
spring:
  application:
    name: simple-spring-boot-demo
  data:
    mongodb:
      database: myDB
      host: 127.0.0.1
      port: 27017
      username: admin
      password: 123456

项目启动报错:

2022-01-05 21:17:57.768  INFO 32920 --- [           main] org.mongodb.driver.cluster               : Adding discovered server 127.0.0.1:27017 to client view of cluster
2022-01-05 21:17:57.993  INFO 32920 --- [127.0.0.1:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server 127.0.0.1:27017

com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='admin', source='admin', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:162) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:39) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:68) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:46) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:168) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:46) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:122) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:52) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:127) ~[mongodb-driver-core-3.6.4.jar:na]
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:114) ~[mongodb-driver-core-3.6.4.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server 127.0.0.1:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }

解决方式参考:https://www.cnblogs.com/niwotaxuexiba/p/10642291.htmlhttps://blog.csdn.net/qq_45186545/article/details/107553692

创建一个myDB下的账号

> use myDB
switched to db myDB
> 
> 
> db.createUser({user:"zhang_san",pwd:"123456",roles:["readWrite"]})
Successfully added user: { "user" : "zhang_san", "roles" : [ "readWrite" ] }

修改application.yml的连接配置,密码需要用单引号包起来

spring:
  application:
    name: simple-spring-boot-demo
  data:
    mongodb:
      database: myDB
      host: 127.0.0.1
      port: 27017
      username: zhang_san
      password: '123456'
      option:
        max-connection-idle-time: 1500
        max-connection-per-host: 200
        max-wait-time: 60000
        max-connection-life-time: 0
        connect-timeout: 10000
        socket-timeout: 60000
  1. 查询数据

import lombok.Data;

import java.util.Date;

/**
 * @author Jenson
 */
@Data
public class MongoTestData {

    private String name;

    private Integer age;

    private Date lastModified;

}

package com.jenson.controller.v1;

import com.jenson.entity.MongoTestData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author Jenson
 */
@RestController
@RequestMapping("/mongo")
@Slf4j
public class MongoDbController {

    @Autowired
    private MongoTemplate mongoTemplate;

    @GetMapping()
    public List<MongoTestData> searchData(@RequestParam String param,
                                          @RequestParam String value) {
        Query query = new Query();
        Criteria criteria = Criteria.where(param).is(value);
        query.addCriteria(criteria);
        List<MongoTestData> list = mongoTemplate.find(query, MongoTestData.class, "myCollection");
        return list;
    }
}

使用的操作mongo的bean是MongoTemplate,详细操作可以查看源码

调用测试
http://localhost:8010/mongo?param=name&value=alix

[
  {
    "name": "alix",
    "age": 30,
    "lastModified": "2022-01-05T12:38:54.530+0000"
  }
]

相关文章

网友评论

      本文标题:MongoDB入门

      本文链接:https://www.haomeiwen.com/subject/qcmhcrtx.html