安装:

官网:https://www.mongodb.org/

按官方教程: http://docs.mongodb.org/master/tutorial/install-mongodb-on-red-hat/

设置

linux 下修改数据文件地址:

/etc/mongod.conf

修改: dbpath,logpath

一定要注意,指定的位置需要使用命令:

sudo chmod o+rwx 新的MongoData路径

在修改了: /etc/selinux/config 之后, 一定要重启才能生效。

启动:

/usr/bin/mongod -f /etc/mongod.conf

开机启动:

sudo chkconfig --level 3 mongod

设置远程连接

打开: /etc/mongodb.conf ,修改 bind_ip=对外IP,0.0.0.0 (不能是 127.0.0.1)

不能注释, 如果注释的话, 用 netstat -anlp | grep 27017 查看, 它还绑定到 127.0.0.1 上!

重启: sudo service mongod restart

客户端连接:  mongo  ip:port

开机启动:

http://blog.csdn.net/u012979009/article/details/48052223

查看 mongo 路径:

$which mongod

  usr/bin/mongod

$ touch etc/init.d/mongod

$ chmod 777 etc/init.d/mongod

$ vi etc/init.d/mongod

#!/bin/sh
#
#chkconfig:
#description: mongodb if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi start() {
usr/bin/mongod -f /etc/mongod.conf
} stop() {
usr/bin/mongod -f /etc/mongod.conf --shutdown
} case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit
esac

$ chkconfig --add mongod

$ chkconfig mongod on

$ service mongod start

无法启动Service

Failed to start mongod.service: Unit mongod.service not found.

mongod --config /etc/mongod.conf  --fork

用户名密码

1. 先注释 /etc/mongod.conf 里的:

#security:
# authorization: enabled

2. 重启 mongod

service mongod restart 在 Ubunu16.04 ,mongo3.6下不好使,执行完后,没有错误提示,但是没有效果.

ps aux | grep mongo

kill -9  pid

/usr/bin/mongod -f /etc/mongod.conf &

3.  清除用户

use admin

db.system.users.remove({})

4. 添加用户:

先添加 root 角色

use admin

db.createUser( { user: "admin" , pwd:"123", roles:[ "root" ,  "readWrite" ]   } );

再创建数据库

use pzx

db.createUser( { user: "pzx" , pwd:"123", roles:[ "dbOwner" ,  "readWrite" ]   } );

连接:

  mongo  数据库 --host ip  -u pzx -p 123

  注意,启用用户名密码后, 必须填写 数据库 名字。

连接字符串:

spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test

修改密码

https://yq.aliyun.com/articles/43274

db.changeUserPassword('tank2','test');

导出

mongodump --host=ip  --port=27717  --username=pzx_online  --password=    --db=pzx_online  --out=./

导入

mongorestore --host=ip --port=27717 --username=pzx  --password=  --db=pzx  --dir=./pzx_online

教程:

1. 如何使用内存:http://www.oschina.net/question/16840_44521

2. MongoDb连接字符串标准:http://www.cnblogs.com/hantianwei/archive/2012/10/15/2725049.html

C#官方的驱动:https://github.com/mongodb/mongo-csharp-driver

C#驱动教程: https://docs.mongodb.org/getting-started/csharp/

Java官方的驱动:http://mongodb.github.io/mongo-java-driver/

Java驱动教程: https://docs.mongodb.org/getting-started/java/

驱动有四个版本,目前还不清楚它们的区别, mongo-java-driver 的在线教程:http://mongodb.github.io/mongo-java-driver/3.2/driver/getting-started/quick-tour/

Mongo扩展的Json:如: $date , $oid

https://docs.mongodb.com/v2.6/reference/mongodb-extended-json/

Mongo配置文件官方

https://docs.mongodb.com/manual/reference/configuration-options/

客户端工具

vue不能方便执行命令。推荐使用:

Robomongo  选 Robo 3T  : https://robomongo.org/

NoSql Manager :http://www.mongodbmanager.com/download

更多工具: https://docs.mongodb.org/ecosystem/tools/administration-interfaces/

防火墙

禁用防火墙

centos 7:
systemctl stop firewalld.service #停止
systemctl disable firewalld.service #禁用

防火墙添加端口号

firewall-cmd --zone=public --add-port=27017/tcp --permanent

firewall-cmd --reload

如果添加Http端口,则:

firewall-cmd --permanent --zone=public --add-service=http

监控

http://blog.csdn.net/yyywyr/article/details/26816809

导出Json

mongoexport -h 192.168.8.161 -u ptr -p 1234 -d ptr -c resume -o abc.json

-h:数据库宿主机的IP

-u:数据库用户名

-p:数据库密码

-d:数据库名字

-c:集合的名字

-f:导出的列名

-q:导出数据的过滤条件

--csv:导出格式为csv

--quiet  安静模式,不显示进度

mongoimport -d local -c gis  --type json --file likehua.data  -f username,_id

命令行

参考:http://blog.csdn.net/shirdrn/article/details/7105539

登录: mongo  -u ptr -p 1234 192.168.8.161/ptr

数组

role是user的数组属性

更新数组中的行数据:

db.sysUser.update({ "_id":ObjectId("58dcc7e0b69b336a71c724c6") } ,{ "$set": {"role.1.name":"--abc--"}  });

按数组中的查询条件,进行更新

db.sysUser.update({ "_id":ObjectId("58dcc7e0b69b336a71c724c6") ,"role._id":"12"} ,{ "$set": {"role.$.name":"--xxxx--"} });

封装

先定义一个配置节

    public class MongoConfigSect : ConfigurationSection
{
[ConfigurationProperty("Entitys")]
public EntityCollection Entitys
{
get { return this["Entitys"] as EntityCollection; }
} public class EntityCollection : ConfigurationElementCollection
{
public IEnumerable<GroupCollection.EntityElement> GetConfig(Func<GroupCollection.EntityElement, bool> func)
{
foreach (GroupCollection group in this)
{
foreach (GroupCollection.EntityElement tab in group)
{
if (func(tab)) yield return tab;
}
}
} public GroupCollection.EntityElement GetConfig(string Entity)
{
foreach (GroupCollection group in this)
{
foreach (GroupCollection.EntityElement tab in group)
{
if (tab.Name == Entity ) return tab;
}
}
return new GroupCollection.EntityElement(new GroupCollection(this));
} [ConfigurationProperty("db", IsRequired = false)]
public string db
{
get
{
var theDb = this["db"].AsString();
if (theDb.HasValue()) return theDb;
else return "dbo";
}
} protected override ConfigurationElement CreateNewElement()
{
return new GroupCollection(this);
} protected override object GetElementKey(ConfigurationElement element)
{
GroupCollection siteUser = element as GroupCollection;
return siteUser.Name;
} public override ConfigurationElementCollectionType CollectionType
{
get
{
return ConfigurationElementCollectionType.BasicMap;
}
}
protected override string ElementName
{
get
{
return "Group";
}
} public class GroupCollection : ConfigurationElementCollection
{
public EntityCollection Container { get; private set; } public GroupCollection(EntityCollection entityCollection)
{
this.Container = entityCollection;
} [ConfigurationProperty("Name")]
public string Name
{
get { return (string)this["Name"]; }
} [ConfigurationProperty("db", IsRequired = false)]
public string db
{
get
{
var theDb = this["db"].AsString();
if (theDb.HasValue()) return theDb;
else return Container.db;
}
} protected override ConfigurationElement CreateNewElement()
{
return new EntityElement(this);
} protected override object GetElementKey(ConfigurationElement element)
{
EntityElement siteUser = element as EntityElement;
return siteUser.Name;
} public override ConfigurationElementCollectionType CollectionType
{
get
{
return ConfigurationElementCollectionType.BasicMap;
}
}
protected override string ElementName
{
get
{
return "Entity";
}
} public class EntityElement : ConfigurationElement
{
public GroupCollection Container { get; private set; } public EntityElement(GroupCollection groupCollection)
{
this.Container = groupCollection;
} [ConfigurationProperty("Name")]
public string Name
{
get { return this["Name"] as string; }
} [ConfigurationProperty("db", IsRequired = false)]
public string db
{
get
{
var theDb = this["db"].AsString();
if (theDb.HasValue())
{
return theDb;
}
else return Container.db;
}
}
}
}
}
}

再定义一个助手类

public static partial class mor
{
//配置项
private static MongoConfigSect Sect; private static Dictionary<string, IMongoDatabase> dbs = new Dictionary<string, IMongoDatabase>(); static mor()
{
dbs = new Dictionary<string, IMongoDatabase>();
var em = ConfigurationManager.ConnectionStrings.GetEnumerator();
while (em.MoveNext())
{
var current = em.Current as ConnectionStringSettings;
if (current.ProviderName.Is("mongo") == false) { continue; }
dbs.Add(current.Name, GetMongoDb(current.ConnectionString));
} Sect = (MongoConfigSect)ConfigurationManager.GetSection("Mongo");
} private static string GetDbName(string ConnectionString)
{
//http://www.cnblogs.com/hantianwei/archive/2012/10/15/2725049.html
//mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000 var connStr = ConnectionString.Slice("mongodb://".Length);
var m = Regex.Match(connStr, @"\/\b\w*\b", RegexOptions.Compiled);
if (m.Success)
{
return m.Value.Slice();
}
return null;
} private static IMongoDatabase GetMongoDb(string ConnectionString)
{
var mongoUrl = new MongoUrl(ConnectionString);
var clientSettings = MongoClientSettings.FromUrl(mongoUrl);
if (!clientSettings.WriteConcern.IsAcknowledged)
{
clientSettings.WriteConcern = WriteConcern.Acknowledged; // ensure WriteConcern is enabled regardless of what the URL says
} clientSettings.ServerSelectionTimeout = TimeSpan.FromMilliseconds(); var client = new MongoClient(clientSettings); return client.GetDatabase(GetDbName(ConnectionString));
} private static IMongoCollection<T> GetCollection<T>(string Name = null)
{ //var name = typeof(T).FullName.MySplit('.').Last();
//var configName = Sect.Entitys.GetConfig(name).db; //return dbs[configName].GetCollection<T>(name);
var name = !string.IsNullOrEmpty(Name) ? Name : typeof(T).FullName.MySplit('.').Last(); var configName = Sect.Entitys.GetConfig(name).db; return dbs[configName].GetCollection<T>(name);
} private static Dictionary<string, object> _dict = new Dictionary<string, object>(); private static IMongoCollection<T> Get<T>(string name = null)
{
if (!string.IsNullOrEmpty(name))
{
if (_dict.ContainsKey(name) == false)
{
_dict[name] = GetCollection<T>(name);
}
return _dict[name] as IMongoCollection<T>;
}
else
{
var typeName = typeof(T).FullName;
if (_dict.ContainsKey(typeName) == false)
{
_dict[typeName] = GetCollection<T>();
}
return _dict[typeName] as IMongoCollection<T>;
} } }

再手动扩展:

public static partial class mor
{
public static IMongoCollection<WebFileInfo> WebFileInfo { get { return Get<WebFileInfo>(); } }
}

就可以使用了:

mor.WebFileInfo. 各种Mongo操作。

Mongo的 Find方法是扩展方法,需要 using MongoDB.Driver;

如果频繁操作Mongo,需要把连接池设置到足够大,否则报错。

clientSettings.MaxConnectionPoolSize = 10000;

C#使用

Bson是核心

可以这样理解,Bson是Json的扩展格式,Bson比Json更容易定位,Bson,在存储的时候,多存储了Json.Value的长度,类型等信息。

BsonDocument =》 Json

BsonElement => Json中的一行。

动态条件查询

我更喜欢调用更底层一些的方法,而不是它封装好的Lambda。因为它的Lambda是基于 Expression的, 我在动态构造查询条件时,很费劲。

动态条件查询: http://www.cnblogs.com/lori/p/4536595.html

例子:

var where = new BsonDocument();

if (Mobile.HasValue())
{
where.Add(new BsonElement("Phone", BsonValue.Create(Mobile)));
} if (IDCode.HasValue())
{
where.Add(new BsonElement("IdentityCode", BsonValue.Create(IDCode)));
} if (Email.HasValue())
{
where.Add(new BsonElement("Email", BsonValue.Create(Email)));
} var selectFields = Builders<mor.JobSeekerModel>.Projection.Include("_id"); var Ids = mor.JobSeekerInfo
.Find(new BsonDocumentFilterDefinition<mor.JobSeekerModel>(where))
.Project(selectFields)
.ToListInline()
.Select(o => o.GetValue("_id").AsString)
.ToArray()
;

JavaScript

Mongo集成Javascript才是真正的逆天。

where

db.jianli.find( "this.JianLiContentTXT.length > 2000" ).limit(1)

=

db.jianli.find(function(){ return this.JianLiContentTXT.length > 2000 ;} ).limit(1)

导出所有的索引

var ary = [];
db.getCollectionNames().forEach(function(it){ var iks = db.getCollection(it).getIndexes() ; iks = iks.filter( function(it) { return !("_id" in it.key) } ) if( iks.length < 1){
return ;
} iks.forEach(function(it){ delete it.v ; it.collection = it.ns.split(".").slice(-1)[0] ; delete it.ns; } ) Array.prototype.push.apply(ary, iks )
}) printjson(ary);

重建索引:

var ary = [] ;// 上面生成的数据.
ary.forEach(function(it){
db.getCollection(it.collection).dropIndex(it.key);
db.getCollection(it.collection).ensureIndex(it.key,{"unique":it.unique || false , name : it.name })
});

优化

1. 使用 ObjectId 类型的 _id

2. 遍历集合时,使用 _id 排序 比 无排序 更快。

http://www.jb51.net/article/62654.htm

后记

1. 它不成熟,还有很多坑,不应该在系统中作为主要业务库使用。

2. 性能的话,也仅高一个数量级而己。完全可以在关系型数据库上做索引,分表 等优化。

3. 优先使用关系型数据库,如果关系型数据库解决不了,则可以针对性升级, 针对查询,使用 Es , 针对存储,使用 Redis。

4. 它会持续影响数据的使用方式,设计时,运行时,数量暴发时,等等。达不到一劳永逸的效果。

MongoDb 配置笔记的更多相关文章

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

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

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

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

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

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

  4. MongoDB学习笔记一:MongoDB的下载和安装

    MongoDB学习笔记一:MongoDB的下载和安装 趁着这几天比較空暇,准备学习一下MongoDB数据库.今天就简单的学习了一些MongoDB的下载和安装.并创建了存储MongoDB的数据仓库. 将 ...

  5. MongoDB 学习笔记(一):安装及简单shell操作

    一.说明 1.该系列MongoDB学习笔记的学习环境采用的MongoDB版本为mongodb-win32-i386-2.4.6,操作系统为win7. 二.安装 1.新建两个目录,分别是D:\Insta ...

  6. MongoDB学习笔记:文档Crud Shell

    MongoDB学习笔记:文档Crud Shell   文档插入 一.插入语法 db.collection.insertOne() 将单个文档插入到集合中.db.collection.insertMan ...

  7. MongoDB学习笔记:MongoDB 数据库的命名、设计规范

    MongoDB学习笔记:MongoDB 数据库的命名.设计规范     第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...

  8. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  9. MongoDB学习笔记二- Mongoose

    MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...

随机推荐

  1. pjsip 播放音视频

    http://blog.csdn.net/leixiaohua1020/article/details/40246783 onCallMediaState回调里,解码方向,获取ci.media[i]. ...

  2. [20190101]块内重整.txt

    [20190101]块内重整.txt --//我不知道用什么术语表达这样的情况,我仅仅一次开会对方这么讲,我现在也照用这个术语.--//当dml插入数据到数据块时,预留一定的空间(pctfree的百分 ...

  3. 洗礼灵魂,修炼python(67)--爬虫篇—cookielib之爬取需要账户登录验证的网站

    学完前面的教程,相信你已经能爬取大部分的网站信息了,但是当你爬的网站多了,你应该会发现一个新问题,有的网站需要登录账户才能看到更多的信息对吧?那么这种网站怎么爬取呢?这些登录数据就是今天要说的——co ...

  4. mysql 最左匹配 联合索引

    mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1).(col1,col2)上建立了索引:如果有一个3列索引(col1 ...

  5. emacs 配置.emacs

    emacs 配置.emacs (require 'package) (package-initialize) (add-to-list'package-archives '("melpa&q ...

  6. 实现Github和Coding仓库等Git服务托管更新

    如何使Github.Coding.Gitee 码云 同时发布更新,多个不同Git服务器之间同时管理部署发布提交 缘由 因为在Github上托管的静态页面访问加载速度较为缓慢,故想在Coding上再建一 ...

  7. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  8. WIN10中DOCKER的安装

    1.docker的安装 环境准备 Docker for Windows是一个Docker Community Edition(CE)应用程序.Docker for Windows安装包包含了在Wind ...

  9. E. Superhero Battle Codeforces Round #547 (Div. 3) 思维题

    E. Superhero Battle time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  10. Django-rest-framework 接口实现 版本控制 versioning

    版本控制 rest_framework 提供了 5 种版本控制 以及对应的 写法 url的 更改都可以 在 from rest_framework import versioning 中查看 Acce ...