mongodb搭建与使用

本文详细介绍了在Windows上安装MongoDB的过程,包括配置数据和日志文件路径,设置为Windows服务。还讨论了MongoDB的安全性,如何启用身份验证,并提供了创建用户账号的步骤。此外,文章提到了使用Morphia作为Java ORM框架进行MongoDB操作的方法,包括相关依赖和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.安装
本机windows,直接安装,配置好mongodata文件夹,文件夹下存放mongo.conf,还有db,logs2个文件夹存放数据与日志,配置成windows服务启动
附mongo.conf内容:
#数据库路径  
dbpath=F:\dev\mongodata\db  
#日志输出文件路径  
logpath=F:\dev\mongodata\logs\mongo.log
#错误日志采用追加模式  
logappend=true  
#启用日志文件,默认启用  
journal=true  
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false  
quiet=true  
#端口号 默认为27017  
port=27017

二.配置账号密码auth
1.配置
mongodb是不需要账号密码的,但是出于安全考虑,我们还是要给mongodb配上账号密码
重启mongodb服务,加上auth,示例:
mongod --dbpath F:\dev\mongodata\db  --logpath F:\dev\mongodata\logs\Mongodb.log –logappend –serviceName MongoDB --auth  --install

2.创建自定义账号密码的用户
我用的是3.0+的版本,创建账号密码的命令与以前的版本不一样,网上一开始找的是旧的版本
命令示例:
db.createUser( { "user" : "admin",
                 "pwd": "123456",
                 roles:["root"]})

use spider  
db.createUser(  
  { user: "spiderAdmin",  
    customData: {description:"superuser"},
    pwd: "123456",  
    roles: [
        { role: "readWrite", db: "spider" },
        { role: "dbAdmin", db: "spider" }
     ]  
  }  
)

3.MongoDB   注意事项 authentication failed
   【一定】要在【命令行 窗口 】里进行创建用户!!!,项目或第三方工具才能 使用用户名密码 连接MongoDB指定的数据库!!!


附:
1.mongodb其他命令学习: http://www.cnblogs.com/cswuyg/p/4595799.html

三.ORM框架-morphia

其中有部分是旧版本代码,方法已经废弃
贴出最新代码:
maven依赖:
<!-- mongodb start-->
<dependency>
<groupId> org.mongodb </groupId>
<artifactId> mongo-java-driver </artifactId>
<version> 3.4.2 </version>
</dependency>

<dependency>
<groupId> org.springframework.data </groupId>
<artifactId> spring-data-mongodb </artifactId>
<version> 1.10.6.RELEASE </version>
<exclusions>
<exclusion>
<artifactId> spring-expression </artifactId>
<groupId> org.springframework </groupId>
</exclusion>
<exclusion>
<groupId> org.mongodb </groupId>
<artifactId> mongo-java-driver </artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- mongodb end -->

<dependency>
<groupId> org.mongodb.morphia </groupId>
<artifactId> morphia </artifactId>
<version> 1.3.1 </version>
<exclusions>
<exclusion>
<groupId> org.mongodb </groupId>
<artifactId> mongo-java-driver </artifactId>
</exclusion>
</exclusions>
</dependency>

java部分:
1.datastore
import com.google.common.collect.Lists ;
import com.mongodb.Mongo ;
import com.mongodb.MongoClient ;
import com.mongodb.MongoCredential ;
import org.mongodb.morphia.Datastore ;
import org.mongodb.morphia.Morphia ;
import org.springframework.beans.factory.config.AbstractFactoryBean ;

import java.util.List ;

public class DatastoreFactoryBean extends AbstractFactoryBean<Datastore> {

private Morphia morphia ; //morphia实例,最好是单例
private Mongo mongo ; //mongo实例,最好是单例
private String dbName ; //数据库名
private String username ; //用户名,可为空
private String password ; //密码,可为空
private boolean toEnsureIndexes = false; //是否确认索引存在,默认false
private boolean toEnsureCaps = false; //是否确认caps存在,默认false


@Override
protected Datastore createInstance () throws Exception {
//这里的username和password可以为null,morphia对象会去处理
MongoCredential credential = MongoCredential. createScramSha1Credential ( username , dbName , password .toCharArray()) ;
List<MongoCredential> credentialsList = Lists . newArrayList (credential) ;
MongoClient mongoClient = new MongoClient( mongo .getAllAddress() , credentialsList) ;
Datastore ds = morphia .createDatastore(mongoClient , dbName ) ; //morphia.createDatastore(mongo, dbName, username, password == null ? null : password.toCharArray());
if ( toEnsureIndexes ) {
ds.ensureIndexes() ;
}
if ( toEnsureCaps ) {
ds.ensureCaps() ;
}
return ds ;
}

@Override
public Class<?> getObjectType () {
return Datastore. class;
}

@Override
public void afterPropertiesSet () throws Exception {
super .afterPropertiesSet() ;
if ( mongo == null ) {
throw new IllegalStateException( "mongo is not set" ) ;
}
if ( morphia == null ) {
throw new IllegalStateException( "morphia is not set" ) ;
}
}

/*----------------------setters-----------------------*/
}

2.mongo
import com.mongodb.* ;
import org.springframework.beans.factory.config.AbstractFactoryBean ;

import java.util.ArrayList ;
import java.util.List ;

public class MongoFactoryBean extends AbstractFactoryBean<Mongo> {

// 表示服务器列表(主从复制或者分片)的字符串数组
private String[] serverStrings ;
// 是否主从分离(读取从库),默认读写都在主库
private boolean readSecondary = false;
// 设定写策略(出错时是否抛异常),默认采用SAFE模式(需要抛异常)
private WriteConcern writeConcern = WriteConcern. JOURNALED ;

@Override
public Class<?> getObjectType () {
return Mongo. class;
}

@Override
protected Mongo createInstance () throws Exception {
MongoClient mongo = initMongo() ;

// 设定主从分离
if ( readSecondary ) {
mongo.setReadPreference(ReadPreference. secondaryPreferred ()) ;
}

// 设定写策略
mongo.setWriteConcern( writeConcern ) ;
return mongo ;
}

/**
* 初始化mongo实例
*
* @return
* @throws Exception
*/
private MongoClient initMongo () throws Exception {
// 根据条件创建Mongo实例
MongoClient mongo = null;
List<ServerAddress> serverList = getServerList() ;

if (serverList.size() == 0 ) {
mongo = new MongoClient() ;
} else if (serverList.size() == 1 ) {
mongo = new MongoClient(serverList.get( 0 )) ;
} else {
mongo = new MongoClient(serverList) ;
}
return mongo ;
}


/**
* 根据服务器字符串列表,解析出服务器对象列表
* <p>
*
* @return
* @throws Exception
* @Title: getServerList
* </p>
*/
private List<ServerAddress> getServerList () throws Exception {
List<ServerAddress> serverList = new ArrayList<ServerAddress>() ;
try {
for (String serverString : serverStrings ) {
String[] temp = serverString.split( ":" ) ;
String host = temp[ 0 ] ;
if (temp. length > 2 ) {
throw new IllegalArgumentException(
"Invalid server address string: " + serverString) ;
}
if (temp. length == 2 ) {
serverList.add( new ServerAddress(host , Integer
. parseInt (temp[ 1 ]))) ;
} else {
serverList.add( new ServerAddress(host)) ;
}
}
return serverList ;
} catch (Exception e) {
throw new Exception(
"Error while converting serverString to ServerAddressList" ,
e) ;
}
}
}

3.morphia
import org.mongodb.morphia.Morphia ;
import org.springframework.beans.factory.config.AbstractFactoryBean ;

public class MorphiaFactoryBean extends AbstractFactoryBean<Morphia> {
/**
* 要扫描并映射的包
*/
private String[] mapPackages ;

/**
* 要映射的类
*/
private String[] mapClasses ;

/**
* 扫描包时,是否忽略不映射的类
* 这里按照Morphia的原始定义,默认设为false
*/
private boolean ignoreInvalidClasses ;

@Override
protected Morphia createInstance () throws Exception {
Morphia m = new Morphia() ;
if ( mapPackages != null ) {
for (String packageName : mapPackages ) {
m.mapPackage(packageName , ignoreInvalidClasses ) ;
}
}
if ( mapClasses != null ) {
for (String entityClass : mapClasses ) {
m.map(Class. forName (entityClass)) ;
}
}
return m ;
}

@Override
public Class<?> getObjectType () {
return Morphia. class;
}
}

dao示例:
import com.lianj.data.spider.center.mongo.pojo.OriginalMatPrice ;
import org.mongodb.morphia.Datastore ;
import org.mongodb.morphia.dao.BasicDAO ;

public class OriginalMatPriceDAO extends BasicDAO< OriginalMatPrice , Integer> {

protected OriginalMatPriceDAO (Datastore ds) {
super (ds) ;
}
}

xml部分:
< mongo :mongo-client id ="mongo" replica-set ="${mongoDB.server}" >
< mongo :client-options connections-per-host ="${mongoDB.preHost}"
threads-allowed-to-block-for-connection-multiplier ="${mongoDB.multiplier}"
connect-timeout ="${mongoDB.connectTimeout}"
max-wait-time ="${mongoDB.waitTimeout}"
socket-keep-alive ="${mongoDB.keepAlive}"
socket-timeout ="${mongoDB.socketTimeout}" />
</ mongo :mongo-client>

<!-- 使用工厂创建morphia实例,同时完成类映射操作 -->
<bean id ="morphia" class ="com.lianj.data.spider.center.mongo.factory.MorphiaFactoryBean" >
<!-- 指定要扫描的POJO包路径 -->
<property name ="mapPackages" >
<array>
<value> com.lianj.data.spider.center.mongo.pojo </value>
</array>
</property>

<!-- 指定要映射的类 -->
<!-- <property name="mapClasses">
<array>
<value>me.watchzerg.test.morphia.pojo.Hotel</value>
<value>me.watchzerg.test.morphia.pojo.Address</value>
</array>
</property> -->

<!-- 扫描包时是否忽略不可用的类,默认为false -->
<!-- <property name="ignoreInvalidClasses" value="false"/> -->
</bean>

<!-- 使用工厂创建datastore,同时完成index和caps的确认操作 -->
<bean id ="datastore" class ="com.lianj.data.spider.center.mongo.factory.DatastoreFactoryBean" >
<property name ="morphia" ref ="morphia" />
<property name ="mongo" ref ="mongo" />

<!-- collection的名称 -->
<property name ="dbName" value ="${mongoDB.dbName}" />

<!-- 用户名和密码可以为空 -->
<property name ="username" value ="${mongoDB.username}" />
<property name ="password" value ="${mongoDB.password}" />

<!-- 是否进行index和caps的确认操作,默认为flase -->
<property name ="toEnsureIndexes" value ="true" />
<property name ="toEnsureCaps" value ="true" />
</bean>

<!-- ===============以下是具体DAO的实现===================== -->

<bean id ="originalSupplierDAO" class ="com.lianj.data.spider.center.mongo.dao.OriginalSupplierDAO" >
<constructor-arg ref ="datastore" />
</bean>

properties部分:
#mongo 属性配置
mongoDB.preHost = 200
mongoDB.multiplier = 100
mongoDB.connectTimeout = 1000
mongoDB.waitTimeout = 1500
mongoDB.keepAlive = true
mongoDB.socketTimeout = 1500

#mongodb账号密码
mongoDB.username = xxx
mongoDB.password = xxx

mongoDB.server = 192.168.xxx.xxx:27017
mongoDB.dbName = xxx

附morphia学习网页:


3. 使用 Morphia 和 MongoDB 实现域模型持久性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值