以下环境为mac osx + jdk 1.8 + mongodb v3.2.3

一、安装

brew安装方式是mac下最简单的方式

brew update
brew install mongodb

其它OS上的安装请参考:https://docs.mongodb.org/manual/installation/

二、启动

2.1 最基本的启动

mongod

不加任何参数时,db默认保存在/data/db目录(如果该目录不存在,启动会报错),监听的端口是27017,且不启动安全认证机制(即:谁都可以连接,只要连接上来的用户都是管理员)

2.2 指定dbpath

mongod --dbpath ~/data/db/mongo

指定dbpath后,数据文件将保存在指定的目录下(注意:该目录必须有读写权限)

2.3 指定端口

mongod --dbpath ~/data/db/mongo --port 12345

2.4 启用安全认证

mongod --dbpath ~/data/db/mongo --port 12345 --auth

这个下面还会仔细讲解,这里只要记得有--auth这个选项即可。

2.5 其它一些选项

mongod --help

如果想详细了解所有启动选项,可以加--help查看所有可选参数。

启动成功后,可以用 mongo 命令来连接

➜  ~ mongo
MongoDB shell version: 3.2.4
connecting to: test
>

然后就可以直接使用各种命令来操作db了 

三、安全相关

不带--auth的启动方式是很可怕的,没有任何安全控制,一般只限于开发环境。生产环境肯定要开启安全认证,mongodb在安全认证的主要思路是:

先在某个库上创建用户(db.createUser) -> 将该用户授权(db.auth) -> mongod启动时指定--auth选项 -> mongo客户端连接时指定用户名、密码、认证db(或者连接时先不指定用户名、密码,连接上以后,再用db.auth切换到认证用户身份)

3.0 创建数据库

use mydb

跟mysql差不多,use 后加数据库名称即可,如果数据库不存在,会自动创建。假设以下的所有安全相关的操作,都是在mydb这个库下。

3.1 创建用户

切换到相对的db后,使用下面的命令创建用户

db.createUser( { "user" : "admin",
"pwd": "123456",
"roles" : [ "readWrite","dbAdmin","userAdmin"]})

这样就创建了一个名为admin的管理员,而且具备读写、db管理、用户管理权限。如果想知道mongo默认有哪些roles角色,可参考:https://docs.mongodb.org/manual/reference/built-in-roles/#built-in-roles

3.2 授权

db.auth({
user: "admin",
pwd: "123456"
})

3.3 用--auth 重启mongod

mongod --auth

3.4 客户端连接时,指定安全信息

mongo localhost:27017/mydb -u admin -p 123456 --authenticationDatabase mydb

大家参考上面的命令修改相关参数(比如:端口号之类的),连接上去后,可以尝试

db.orders.insert({'orderId':1,'productName':'iphone'})

看看能否写入数据。

注:作为对比,大家还可以创建一个其它只有read权限的用户(比如:guest/guest),同样的姿势连接上去,再insert试试,正常情况话,应该写入失败。

安全相关的更详细信息,请参考 :https://docs.mongodb.org/manual/core/authentication/

四、CRUD操作

一般教程上都是讲解如果在mongo终端下使用命令来做CRUD,但是更多情况下,我们是在代码里完成这些操作的,所以下面说下如何利用spring-data-mongo来操作mongo,以gradle项目为例,下面的代码参考了spring官方的示例代码

4.1 build.gradle文件

group 'com.cnblogs.yjmyzz'
version '1.0-SNAPSHOT' apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'spring-boot' sourceCompatibility = 1.8 buildscript {
repositories {
maven {
url 'http://maven.oschina.net/content/groups/public/'
}
} dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
}
} repositories {
maven {
url 'http://maven.oschina.net/content/groups/public/'
}
} dependencies {
compile 'org.springframework.data:spring-data-mongodb:1.8.4.RELEASE'
compile("org.springframework.boot:spring-boot-starter-actuator")
testCompile group: 'junit', name: 'junit', version: '4.12'
} mainClassName = 'com.cnblogs.yjmyzz.mongo.Application'

其实关键的只有一行:

compile 'org.springframework.data:spring-data-mongodb:1.8.4.RELEASE'

4.2 spring配置文件

 <?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:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation=
"http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <mongo:db-factory id="mongoDbFactory"
host="localhost"
port="27017"
dbname="yjmyzz"
username="admin"
password="123456"/> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean> </beans>

4.3 定义Model

package com.cnblogs.yjmyzz.mongo.model;

import org.springframework.data.annotation.Id;

public class Customer {

    @Id
private String id; private String firstName;
private String lastName; public Customer() {} public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
} @Override
public String toString() {
return "Customer{" +
"id='" + id + '\'' +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
}
}

4.4 定义DAO接口

package com.cnblogs.yjmyzz.mongo.repository;

import com.cnblogs.yjmyzz.mongo.model.Customer;
import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface CustomerRepository extends MongoRepository<Customer, String> { public Customer findByFirstName(String firstName); public List<Customer> findByLastName(String lastName); }

这里有一些默认的约定要理解,比如上面的findByLastName这个方法,执行时会自动按Customer的lastName属性来find数据。更详细的方法名与类属性的默认约定,可参考:http://docs.spring.io/spring-data/data-mongo/docs/1.8.4.RELEASE/reference/html/

4.5 Application使用示例

package com.cnblogs.yjmyzz.mongo;

import com.cnblogs.yjmyzz.mongo.model.Customer;
import com.cnblogs.yjmyzz.mongo.repository.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import java.util.List; @Configurable()
@SpringBootApplication
@ImportResource("classpath:spring-context.xml")
public class Application implements CommandLineRunner { @Autowired
private CustomerRepository repository; @Autowired
MongoTemplate mongoTemplate; public static void main(String[] args) { SpringApplication.run(Application.class, args); // ApplicationContext ctx = SpringApplication.run(Application.class, args);
//
// System.out.println("getBeanDefinitionNames ==> ");
// for (String beanName : ctx.getBeanDefinitionNames()) {
// System.out.println(beanName);
// }
// System.out.println("<=="); } @Override
public void run(String... args) throws Exception { repository.deleteAll(); // save a couple of customers
repository.save(new Customer("Alice", "Smith"));
repository.save(new Customer("Bob", "Smith"));
repository.save(new Customer("张", "三"));
repository.save(new Customer("李", "四"));
repository.save(new Customer("王", "五"));
repository.save(new Customer("赵", "六"));
repository.save(new Customer("周", "七"));
repository.save(new Customer("杨", "八")); // fetch all customers
System.out.println("Customers found with findAll():");
System.out.println("-------------------------------");
for (Customer customer : repository.findAll()) {
System.out.println(customer);
}
System.out.println(); // fetch an individual customer
System.out.println("Customer found with findByFirstName('Alice'):");
System.out.println("--------------------------------");
System.out.println(repository.findByFirstName("Alice")); System.out.println("Customers found with findByLastName('Smith'):");
System.out.println("--------------------------------");
for (Customer customer : repository.findByLastName("Smith")) {
System.out.println(customer);
} System.out.println("分页测试==>");
Page<Customer> pageData = repository.findAll(new PageRequest(0, 4));
for (Customer c : pageData) {
System.out.println(c);
}
System.out.println("----------");
System.out.println(String.format("第%d页 , 总页数:%d , 总记录数:%d , %d条/页",
pageData.getNumber() + 1,
pageData.getTotalPages(),
pageData.getTotalElements(),
pageData.getSize()
)); //按条件动态查询
Customer c = mongoTemplate.findOne(new Query(Criteria.where("firstName").is("杨")), Customer.class);
System.out.println(c); System.out.println("----------"); List<Customer> list = mongoTemplate.find(new Query(Criteria.where("firstName").in("李","赵")), Customer.class); for (Customer item : list) {
System.out.println(item);
}
} }

github上已经开源了该项目:https://github.com/yjmyzz/spring-mongo-sample 供有需要的同学参考

mongodb 速成笔记的更多相关文章

  1. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  2. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  3. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

  4. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  5. MongoDB学习笔记(转)

    MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...

  6. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...

  7. MongoDB学习笔记(六)--复制集+sharding分片 && 总结

    复制集+sharding分片                                                               背景 主机 IP 服务及端口 Server A ...

  8. MongoDB学习笔记(五)--复制集 && sharding分片

    主从复制                                                                                       主从节点开启 主节 ...

  9. MongoDB学习笔记(四)--索引 && 性能优化

    索引                                                                                             基础索引 ...

随机推荐

  1. 【分布式】Zookeeper数据与存储

    一.前言 前面分析了Zookeeper对请求的处理,本篇博文接着分析Zookeeper中如何对底层数据进行存储,数据存储被分为内存数据存储于磁盘数据存储. 二.数据与存储 2.1 内存数据 Zooke ...

  2. 基于HTML5的WebGL应用内存泄露分析

    上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...

  3. DataTable与DTO对象的简易转换类

    在web开发过程中,有时候为了数据传输的方便,比如:后台需要更新前端的ViewModel,此时我们定义一个与前端ViewModel结构一样的DTO对象,从数据层获取数据后,将数据封装成DTO然后序列化 ...

  4. asp.net core 依赖注入问题

    最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久,现在我贴出来,希望可以有人帮忙 ...

  5. 全局变量:global与$GLOBALS的区别和使用

    今天在写框架的时候想把SaeMySQL初始化之后作为全局变量使用.但是后来发现PHP中的全局变量和Java或者OC中的全局变量还是有较大区别的.下面记录一下php里面的global的使用相关注意事项. ...

  6. Oracle Blob数据保存为文件

    好久不写文,最近得空写一点.Oracle数据库国内用户量主要在企业上,其中有一种byte的存储称为Blob,并不能直接看. 有时候为了调试需要,可以通过: ,)) ; 这种sql去转为字符串查看,但是 ...

  7. python之最强王者(2)——python基础语法

    背景介绍:由于本人一直做java开发,也是从txt开始写hello,world,使用javac命令编译,一直到使用myeclipse,其中的道理和辛酸都懂(请容许我擦干眼角的泪水),所以对于pytho ...

  8. java web学习总结(二十七) -------------------JSP标签介绍

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  9. 【原】EasyUI ComboGrid 集成分页、按键示例

    需求: 1.下拉框下拉时出现表格: 2.表格带分页功能: 3.可以使用向上键.向下键在表格中移动选择行数据: 4.可以使用回车键在表格中选中行数据: 5.在下拉框的文本框中输入内容,能查询表格: 6. ...

  10. 移除HTML5 input在type="number"时的上下小箭头

    /*移除HTML5 input在type="number"时的上下小箭头*/ input::-webkit-outer-spin-button, input::-webkit-in ...