mongodb
Posted it-dwh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb相关的知识,希望对你有一定的参考价值。
1、下载安装包:mongodb-win32-x86_64-2008plus-ssl-3.4.7-signed
2、安装mongodb
3、启动mongodb
4、连接mongodb
5、接下来会展示库的增删改查,表的增删改查,记录的增删改查:
6、数据库的增删改查:
7、上面展示了:
库的增删查,库的修改很少用,暂时不提供
表的增删查,表的修改很少用,暂时不提供
8、记录的增删改查:
mongodb的更新还有很多内容,例如:
将一个字段原有的值加1,或者将一个字段直接删除掉,或者将一个字段值置为null, 或者在数组中删除旧的元素,并增加新的元素进去,用到的关键字也是很多:
字段值增加 $inc
删掉字段:$unset
数组值追加及删除元素:$push 、 $pushAll 和 $pop、 $pull 、 $pullAll
添加到数组,原先有这个值就不增加,如果没有再增加 $addToSet
更新还有一个函数可以做到:save()
9、重点来了,mongodb的查询
以下是mongodb的聚合运算
聚合运算有以下内容:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
以上这些聚合函数都是平级的,没有先后顺序之分,跟linux中的管道一个意思。match用在group前那就相当于where,用在group之后,就相当于having
#################################我是分割线:副本操作###################################
原理:一主多从
主服务器将用户的动作记录在oplog中,从节点定期轮询去获取这些操作,从节点上也执行这些操作,这样从节点可定期地和主节点保持同步
但是从节点始终比主节点要落后一点。下图是从http://www.runoob.com/mongodb/mongodb-replication.html拷贝来的
################################我是分割线:分片###########################
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
下图是从http://www.runoob.com/mongodb/mongodb-sharding.html拷贝来的
上图中主要有如下所述三个主要组件:
- Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
- Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
- Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
########################我是分割线:备份与恢复####################
略
#######################我是分割线:集群的监控#####################
####################我是分割线:使用java代码来操作mongodb####################
在使用代码mongodb前,需要先导入依赖:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.bson.BsonDocument; import org.bson.Document; import org.bson.codecs.configuration.CodecRegistry; import org.bson.conversions.Bson; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoIterable; public class MongdbTest { public static void main(String[] args) { final MongoClient client = new MongoClient("localhost", 27017); // 这个方法共有16个重载的,可根据自己情况使用不同的方法 final MongoDatabase mytest = client.getDatabase("mytest"); System.out.println("已经连接到了数据库"); // 新建并查询集合 final MongoCollection<Document> collection_hello = mytest.getCollection("hello"); if (null == collection_hello) { createCollection(mytest, "hello"); } final List<String> collectionNames = showCollections(mytest); System.out.println(collectionNames); // 往集合里填数据: final List<Document> data = getData(); insert(mytest, "hello", data); // 查询数据 List<Document> docList = find(mytest, "hello"); for (final Document doc : docList) { System.out.println(doc); } // 查询一个有过滤条件的 docList = findWithCondition(mytest, "hello", new Bson() { public <TDocument> BsonDocument toBsonDocument(Class<TDocument> documentClass, CodecRegistry codecRegistry) { // TODO return null; } }); for (final Document doc : docList) { System.out.println(doc); } client.close(); } /** * 创建一个collection * * @param db * 数据库对象 * @param collectionName * 集合名称 */ public static void createCollection(MongoDatabase db, String collectionName) { db.createCollection(collectionName); } /** * 等同于命令行中的show collections * * @param db * @return 当前库中的集合 */ public static List<String> showCollections(MongoDatabase db) { final ArrayList<String> collectionNameArray = new ArrayList<String>(); final MongoIterable<String> collectionNames = db.listCollectionNames(); final MongoCursor<String> iter = collectionNames.iterator(); while (iter.hasNext()) { collectionNameArray.add(iter.next()); } return collectionNameArray; } /** * 插入数据 * * @param db * @param collectionName * 集合名 * @param docList * 文档列表 */ public static void insert(MongoDatabase db, String collectionName, List<Document> docList) { final MongoCollection<Document> collection = db.getCollection(collectionName); collection.insertMany(docList); } /** * 模拟得到业务数据 * * @return */ public static List<Document> getData() { final List<Document> docList = new ArrayList<Document>(); // 拼接组装第一条document final Map<String, Object> doc = new HashMap<String, Object>(); doc.put("name", "dwh"); doc.put("age", 20); final HashMap<String, String> addressMap = new HashMap<String, String>(); addressMap.put("country", "china"); addressMap.put("province", "shanxi"); addressMap.put("city", "平遥"); doc.put("address", addressMap); final ArrayList<String> hobbyList = new ArrayList<String>(); hobbyList.add("篮球"); hobbyList.add("排球"); hobbyList.add("hello"); doc.put("hobby", hobbyList); docList.add(new Document(doc)); // 添加到list中去 // 拼接组装第二条document doc.clear(); doc.put("name", "dwh2017"); doc.put("age", 25); addressMap.clear(); addressMap.put("country", "china"); addressMap.put("province", "北京"); addressMap.put("city", "海淀"); doc.put("address", addressMap); hobbyList.clear(); hobbyList.add("羽毛球"); hobbyList.add("排球"); hobbyList.add("world"); doc.put("hobby", hobbyList); docList.add(new Document(doc)); // 添加list中去 return docList; } /** * 查询数据 * * @param db * @param collectionName * @return */ public static List<Document> find(MongoDatabase db, String collectionName) { final List<Document> docList = new ArrayList<Document>(); final MongoCollection<Document> collection = db.getCollection(collectionName); final FindIterable<Document> find = collection.find(); final MongoCursor<Document> cursor = find.iterator(); while (cursor.hasNext()) { docList.add(cursor.next()); } return docList; } /** * 有条件滴查询数据 * * @param db * @param collectionName * @param bson * 条件 * @return */ public static List<Document> findWithCondition(MongoDatabase db, String collectionName, Bson bson) { final List<Document> docList = new ArrayList<Document>(); final MongoCollection<Document> collection = db.getCollection(collectionName); final FindIterable<Document> find = collection.find(bson); final MongoCursor<Document> cursor = find.iterator(); while (cursor.hasNext()) { docList.add(cursor.next()); } return docList; } }
以上是关于mongodb的主要内容,如果未能解决你的问题,请参考以下文章
ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项
在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects