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 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS