MongoDB 入门教程系列之一:开发环境搭建以及 Node.js 和 Java 的读写访问

MongoDB 是近年来非常流行的一个介于关系数据库和非关系数据库之间的解决方案,采取面向文档的分布式设计思路,具有强大的可扩展性,表结构自由,并且支持丰富的查询语句和数据类型。时至今日,MongoDB 以其灵活的数据存储方式,逐渐成为 IT 行业非常流行的一种非关系型数据库解决方案。

笔者在项目中也经历了从零开始学习 MongoDB 数据库的过程,因此想把我学习过程中的一些心得通过文章分享出来。

步骤1 - MongboDB 环境搭建

MongoDB 支持的数据结构非常松散,是类似 json 的 bson 格式,这种灵活的格式使得 MongoDB 可以存储比较复杂的数据类型。Mongo 最大的特点是它支持的查询语言(Query Language)非常强大,其语法有点类似于面向对象的查询语言,因此可读性非常好,并且几乎可以实现类似关系数据库单表查询的绝大部分功能。

本步骤介绍 MongoDB 学习的第一步:环境搭建。

从 MongoDB 的 官网下载安装包。

我安装在 C 盘的 MyApp 目录下的 mongoDB,安装完毕后,bin 文件夹里有好几个执行文件。把 bin 文件路径加到 windows 系统的环境变量里。

使用如下命令行启动 MongoDB 服务器:

mongod --dbpath C:MyAppmongoDBjerryserverdb 从控制台打印的 console 里看到下列消息:

Mongo DB starting: pid=16588 port=27017 意思是进程 id 为 16588 的进程启动了 MongoDB,监听端口号为 27017.

console 里还有其他一些有用的提示,比如:

Read and write access to data and configuration is unrestricted - 没有对数据读写设置权限

WARNING: This server is bound to localhost - 这个服务器通过 localhost 访问

在 cmd 里用命令 netstat -ano | find "27017", 发现确实进程 id 为 16588 的进程在端口 27017 监听:

打开 MongoDB Compass, 这是 MongoDB GUI 图形化操作界面,在 MongboDB 安装过程中也自动被安装了。

Hostname 输入 localhost,port 输入 27017,点击 Connect 进行连接:

连接之后,在 admin 数据库下创建一个新的 Collection:

我的例子里,collection 名称为 person,点 INSERT DOCUMENT 创建一条记录, _id 为 MongoDB compass 自动生成的, 另一个字段的名称为 name, 值为 “Jerry”:

再点一次 INSERT DOCUMENT, 生成两条 person 记录。

现在我们新开另一个命令提示行窗口来消费在 MongoDB Compass 里创建的两条 person 记录。

命令行 mongo localhost:27017/admin, 意思是连接这个数据库里的 admin 数据库

此时从前一个启动 MongoDB 服务器的命令提示行的控制台输出,能看到 connection accepted from 的输出:

命令行 db.person.find(), 打印出了 admin 数据库里 person 表里的两条记录,说明我们环境配置成功了。

步骤2 - 使用 Node.js 访问 MongoDB

在 localhost:27017 的服务器上,在数据库 admin 下面创建了一个名为 person 的数据库表,并插入了两条记录:

上图是用 MongoDB Compass 查看的成功插入的两条记录。 下面我们用 Node.js 读取这两条记录。 首先在命令行里执行 npm install mongodb, 然后新建一个 JavaScript 文件,复制以下内容:

注意第 12 行的 dbo.collection("person"). find({}).toArray,意思是读取表 person 里的所有记录。

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017";
MongoClient.connect(url, function(err, db) {
    if (err){
        console.log(err);
        throw err;
    }
    console.log("Jerry DB connection established!");
    var dbo = db.db("admin");
    dbo.collection("person"). find({
    }
    ).toArray(function(err, result) {
        if (err)
        throw err;
        console.log(result);
        db.close();
    }
    );
    db.close();
}
);

如果我只想读取 name 为 Jerry 的那条记录,只需要把 where 条件传入方法 find 即可:

从调试器里能观察到按照期望的方式被读取回来了:

步骤3 - 使用 Java 代码往 MongoDB 里插入数据

如果您是基于 Maven 进行依赖管理的 Java 项目,只需要在您的 pom.xml 里加入下面的依赖定义:

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.4</version>
</dependency>

然后使用命令行 mvn clean install 后,您的本地 maven 仓库里会多出三个和用 Java 连接 MongoDB 相关的库:

  • bson
  • mongodb-driver
  • mongodb-driver-core

当然也可以手动逐一下载 jar 文件:https://mongodb.github.io/mongo-java-driver/

本文使用的是这三个文件,将它们下载到本地,再加入 Java 项目的 classpath 里。

Java 代码如下:

package mongoDB;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
public class MongoDBTest {
    private static void insert(MongoCollection<Document> collection) {
        Document document = new Document("name", "dog");
        List<Document> documents = new ArrayList<Document>();
        documents.add(document);
        collection.insertMany(documents);
    }
    public static void main(String args[]) {
        MongoClient mongoClient = null;
        try {
            mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase mongoDatabase = mongoClient.getDatabase("admin");
            System.out.println("Connect to database successfully");
            MongoCollection<Document> collection = mongoDatabase
            .getCollection("person");
            // insert(collection);
            FindIterable<Document> findIterable = collection.find();
            MongoCursor<Document> mongoCursor = findIterable.iterator();
            while (mongoCursor.hasNext()) {
                System.out.println(mongoCursor.next());
            }
        }
        catch (Exception e) {
            System.err.println(e.getClass().getName() + ": " + e.getMessage());
        }
        finally{
            mongoClient.close();
        }
    }
}

和本教程步骤 2相比,上述代码的 insert 方法里还展示了如何用 Java 代码给 MongoDB 数据库里增加记录。

private static void insert(MongoCollection<Document> collection) {
    Document document = new Document("name", "dog");
    List<Document> documents = new ArrayList<Document>();
    documents.add(document);
    collection.insertMany(documents);
}

执行 Java 应用,发现通过 insert 方法加到数据库的记录也能被顺利读出来。

总结

MongoDB 是近年来非常流行的一个介于关系数据库和非关系数据库之间的解决方案,采取面向文档的分布式设计思路,具有强大的可扩展性,表结构自由,并且支持丰富的查询语句和数据类型。本文首先介绍了 MongoDB 的本地环境搭建步骤,接着分别介绍了使用 Node.js 和 Java 对本地 MongoDB 进行数据读写的编程细节。

原文地址:https://cloud.tencent.com/developer/article/2181286

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从来没有最好的K-V系统,只有最适合应用业务实际场景的系统,做任何的方案选择,要结合业务当前的实际情况综合权衡,有所取有所舍。
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确统计,原因在于gitlab的host设置了strict-origin-when-cross-origin, 导致不蒜子不能正确获取referer,从而PV只能统计到网站的PV。 为了方便统计页面的PV,这里简单的写了一个java程
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。 采样率 采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样频率的倒数
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立分布式kv系统替换mongodb的思路
验证用户输入是否正确是我们应用程序中的常见功能。Spring提供了`@Valid`和@`Validated`两个注解来实现验证功能,本文详细介绍 [@Valid]和[@Validated]注解的区别 。
引入pdf2dom &lt;dependency&gt; &lt;groupId&gt;net.sf.cssbox&lt;/groupId&gt; &lt;artifactId&gt;pdf2dom&lt;/artifactId&gt; &lt;version&gt;1.8&lt;/version&
grafana 是一款非常优秀的可视化报表工具,有设计精良的可视化工具,今天来聊一聊如何将grafana集成到自己的应用中。 原理是: grafana允许iframe访问,开启auth.proxy, java 后端鉴权后代理grafana 前端通过iframe访问后端代理过的grafana graf
介绍 Call Graph是一款IDEA插件,用于可视化基于IntelliJ平台的IDE的函数调用图。 这个插件的目标是让代码更容易理解,有助于读懂和调试代码。当前只支持Java。针对Typescript、Javascript或Python工具,可以使用作者的另外一款工具Codemap(https:
原理 通过线程安全findAndModify 实现锁 实现 定义锁存储对象: /** * mongodb 分布式锁 */ @Data @NoArgsConstructor @AllArgsConstructor @Document(collection = &quot;distributed-loc
Singleton 单例模式 单例模式是确保每个应用程序只存在一个实例的机制。默认情况下,Spring将所有bean创建为单例。 你用@Autowired获取的bean,全局唯一。 @RestController public class LibraryController { @Autowired
pipeline 分布式任务调度器 目标: 基于docker的布式任务调度器, 比quartzs,xxl-job 更强大的分布式任务调度器。 可以将要执行的任务打包为docker镜像,或者选择已有镜像,自定义脚本程序,通过pipeline框架来实现调度。 开源地址: https://github.c
python训练的模型,转换为onnx模型后,用python代码可以方便进行推理,但是java代码如何实现呢? 首先ONNX 推理,可以使用`onnxruntime` ```xml com.microsoft.onnxruntime onnxruntime 1.15.1 ``` 另外,训练的模型需要
要获取内网地址,可以尝试连接到10.255.255.255:1。如果连接成功,获取本地套接字的地址信息就是当前的内网IP。 python实现: ```python import socket def extract_ip(): st = socket.socket(socket.AF_INET, s
为什么要有索引 gremlin 其实是一个逐级过滤的运行机制,比如下面的一个简单的gremlin查询语句: g.V().hasLabel(&quot;label&quot;).has(&quot;prop&quot;,&quot;value&quot;) 运行原理就是: 找出所有的顶点V 然后过滤出
最近在分析一个应用中的某个接口的耗时情况时,发现一个看起来极其普通的对象创建操作,竟然每次需要消耗 8ms 左右时间,分析后发现这个对象可以通过对象池模式进行优化,优化后此步耗时仅有 0.01ms。
点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章。 此篇文章介绍 Java JMX 技术的相关概念和具体的使用方式。 当前文章属于Java 性能分析优化系列
如何将Java JAR 转化为 win/mac/linux 独立可执行程序?不需要预装 JRE 运行?
点赞再看,动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 Java 19 在2022 年 9 月 20 日正式发布,Java 19 不是一个长期支持版本,直到 2023 年 3 月它将被 JD
点赞再看,动力无限。Hello world : ) 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章。 前言 Java 反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java 对于 Cla
JSON 对于开发者并不陌生,如今的 WEB 服务、移动应用、甚至物联网大多都是以 **JSON** 作为数据交换的格式。学习 JSON 格式的操作工具对开发者来说是必不可少的。这篇文章将介绍如何使用 **Jackson** 开源工具库对 JSON 进行常见操作。