MongoDB Node 驱动简介

news2024/11/28 14:50:26

MongoDB Node 驱动介绍

1. MongoDB数据库连接指南

使用原生的mongodb Node驱动连接MongoDB数据库。

1.1 数据库连接URI

数据库连接URI是一个指明了数据库地址、名称、用户名、密码的字符串,类似于网页链接。

Each part of the connection string

1.2 Node驱动安装

使用Npm或者Yarn安装数据库驱动程序:

npm install mongodb 
# or
yarn install mongodb

如果使用的是Typescript语言,需要额外的安装Node类型定义:

npm install @types/node

1.3 连接到MongoDB

注意:在执行此步骤之前,需要你已经安装了MongoDB数据库,并确保服务开启。

为了避免像迷宫一样的官网带来困扰,可以看这里:MongoDB数据库简介、安装和基本使用

如果你希望自己下载最新版本的数据库,请访问官网:MongoDB: The Developer Data Platform | MongoDB,并按照以下图片指引找到最新版本链接。

 mongodb下载方法

创建js文件,并编辑如下:

import { MongoClient } from 'mongodb';

const uri = 'mongodb://ahohAdmin:123456@127.0.0.1:27017/db_ahoh'


const client = new MongoClient(uri)

async function run() {
    try {
        const database = client.db('db_ahoh')
        const movies = database.collection('movies')
        await movies.insertOne({ name: '我的36个老婆' }) //插入数据

        const query = { name: '我的36个老婆' } //查询条件
        const movie = await movies.findOne(query)   //执行查询   
        console.log(movie)
    } catch (error) {
        console.log(error)
    } finally {
        await client.close()
    }
}

run().catch(console.dir)

以上代码首先插入了一条数据,然后又通过findOne查询了插入的数据。

2. MongoDB数据插入指南

向集合(表)中插入一条或多条数据,MongoDB常用的插入操作有三种:insertOne()insertManybulkWrite()

2.1 默认的数据标识(主键)_id

当我们插入一条文档(数据)时,MongoDB默认的会强制给这条数据插入一个唯一的_id属性。如果我们插入数据的时候,数据中已经有了此属性(id属性也行),MongoDB不会再生成这个属性。

我们可以直接维护这个属性,但是必须保证属性值唯一,也可以使用驱动产生一个唯一表示作为_id的值。

注意:除非你有足够的理由不使用默认值,且保证其值唯一,否则我还是建议你维持现状,让驱动自动的帮你完成这一切。

2.2 插入一条数据

使用insertOne()方法插入一条数据,成功后返回一个InsertOneResult对象的实例展示插入数据的_id值,结构如下:

{
  acknowledged: true,
  insertedId: new ObjectId("639833c04b5b998bcaaaa2af")
}

举例:

import { MongoClient } from 'mongodb';

const uri = 'mongodb://ahohAdmin:123456@127.0.0.1:27017/db_ahoh'
const client = new MongoClient(uri)
async function run() {
    try {
        const database = client.db('db_ahoh')
        const movies = database.collection('movies')
        let res = await movies.insertOne({ name: '我的37个小妾' }) //插入数据
        console.log(`数据成功插入,插入数据的ID是:${res.insertedId}`)
    } catch (error) {
        console.log(error)
    } finally {
        await client.close()
    }
}

run().catch(console.dir)

代码输出结果:

数据成功插入,插入数据的ID是:639834783d714627b8e3ce06

2.3 插入多条数据

使用insertMany()方法插入多条数据,该方法会根据传入的数据依次插入,知道完成作业或发生异常。

insertMany()方法返回一个InsertManyResult对象实例,其结构如下:

{
  acknowledged: true,
  insertedCount: 4,
  insertedIds: {
    '0': new ObjectId("639836f7d9d870a7aa8a0138"),
    '1': new ObjectId("639836f7d9d870a7aa8a0139"),
    '2': new ObjectId("639836f7d9d870a7aa8a013a"),
    '3': new ObjectId("639836f7d9d870a7aa8a013b")
  }
}

例如,假设需要插入以下数据:

{ name: 'bingbing', desc: "The first wife i want." },
{ name: 'xishi', desc: "The second wife i want." },
{ name: 'diaochan', desc: "The third wife i want." },
{ name: 'chenyuanyuan', desc: "The forth wife i want." },

代码如下:

import { MongoClient } from 'mongodb';

const uri = 'mongodb://ahohAdmin:123456@127.0.0.1:27017/db_ahoh'
const client = new MongoClient(uri)
async function run() {
    try {
        const database = client.db('db_ahoh')
        const movies = database.collection('movies')
        let wifes = [
            { name: 'bingbing', desc: "The first wife i want." },
            { name: 'xishi', desc: "The second wife i want." },
            { name: 'diaochan', desc: "The third wife i want." },
            { name: 'chenyuanyuan', desc: "The forth wife i want." },
        ]
        let res = await movies.insertMany(wifes)
        let ids = res.insertedIds
        for (let id of Object.values(ids)) {
            console.log(`inserted wife ${id} successfully`)
        }
    } catch (error) {
        console.log(error)
    } finally {
        await client.close()
    }
}

run().catch(console.dir)

代码输出:

inserted wife 6398376ca83cd05c318c4fec successfully
inserted wife 6398376ca83cd05c318c4fed successfully
inserted wife 6398376ca83cd05c318c4fee successfully
inserted wife 6398376ca83cd05c318c4fef successfully

2.4 执行多个操作

bulkWrite()方法对单个集合一次性执行批量的写操作。这种方法减少了从应用程序到服务器的网络往返次数,从而提高了吞吐量和性能。只有在传递给方法的所有操作完成后,bulkWrite()才会返回所有操作的结果集合。

bulkWrite()返回一个BulkWriteResult对象实例,结构如下:

BulkWriteResult {
  result: {
    ok: 1,
    writeErrors: [],
    writeConcernErrors: [],
    insertedIds: [ [Object], [Object] ],
    nInserted: 2,
    nUpserted: 1,
    nMatched: 0,
    nModified: 0,
    nRemoved: 0,
    upserted: [ [Object] ]
  }
}

我们可以将以下的一个或多个操作放在bulkWrite()中,一次性执行。

  • insertOne
  • updateOne
  • updateMany
  • deleteOne
  • deleteMany
  • replaceOne

举例如下:

import { MongoClient } from 'mongodb';

const uri = 'mongodb://ahohAdmin:123456@127.0.0.1:27017/db_ahoh'
const client = new MongoClient(uri)
async function run() {
    try {
        const database = client.db('db_ahoh')
        const movies = database.collection('movies')
        const result = await movies.bulkWrite([
            {
                insertOne: {//插入一个
                    document: {//文档
                        name: '我的第38个暖床丫头',
                    },
                },
            },
            {
                insertOne: {
                    document: {
                        name: '我的第39个暖床丫头',
                    },
                },
            },
            {
                updateMany: {
                    // Important: You lose type safety when you use dot notation in queries
                    filter: { "name": "xishi" },
                    update: { $set: { name: '吕布' } },
                    upsert: true,
                },
            },
            {
                deleteOne: {
                    filter: { "name": "diaochan" },
                },
            },
        ]);
        console.log(result);
    } catch (error) {
        console.log(error)
    } finally {
        await client.close()
    }
}

run().catch(console.dir)

以上代码执行了两个插入、一个更新、一个删除操作。

代码执行结果:

BulkWriteResult {
  result: {
    ok: 1,
    writeErrors: [],
    writeConcernErrors: [],
    insertedIds: [ [Object], [Object] ],
    nInserted: 2,
    nUpserted: 0,
    nMatched: 3,
    nModified: 3,
    nRemoved: 1,
    upserted: []
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode题解13 (102,226) 二叉树的层序遍历,翻转二叉树

文章目录二叉树的层序遍历(102)代码解答:翻转二叉树(226)代码解答:二叉树的层序遍历(102) 思路(前序,后序,中序遍历): 二叉树的层序遍历不同于二叉树的前序,后序,中序遍历,层序遍历是将二叉树的每一层从根部开始进行遍历, 将每一层的节点都放到1个集合中…

推断统计 | 学习笔记

一.概率与概率分布 概率论:为解决不确定性问题提供方法 1.随机事件及其概率 基本概念 试验:在相同条件下,对事物或现象所进行的观察。特点是可以在相同的条件下重复进行;每次试验的可能结果不止一个,但试验的所有可…

l2a股接口的委托队列有什么作用?

l2a股接口的委托队列是Level 2行情特有的功能,如下图,在传统交易页面中,可以看到个股封板涨停有35994手,但是不能具体看到各笔委托单的数量,不利于我们甄别究竟是主力在强势封板还是散户在跟风。 而在Level 2行情中可以…

高性能、强稳定的工业级服务器冗余方案是怎样的?

前言 服务器是工业数据采集与上位机进行通信的枢纽,一旦遭到攻击或者出现连接不稳定的情况,导致断开连接,工厂就会出现非计划性的停机停产。这种情况带来的损失是难以估量的。因此,为了保障自动化生产的稳定可控,服务…

关于Detectron库预训练模型的权重转换

关于Detectron库预训练模型的权重转换 最近在调试代码的过程中涉及到detectron库的使用,在模型训练前,主干网络的部分需要加载预训练模型,但是原始的预训练模型在detron库中的代码是不能直接使用的,需要通过转换工具对模型的键值…

Sentinel服务熔断降级

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供…

Redis Lua脚本 Debug

Redis 编程接口之Lua脚本 Redis 使用Lua脚本和Redis Functions扩展其功能。Redis提供编程接口,允许开发者在服务器执行自定义的脚本,对于不同的版本,实现的方式略有不同 Redis 7 及以上版本 使用Redis Functions 管理、运行脚本Redis 6.2及…

【20天快速掌握Python】day02-数据类型转换及运算符

1、数据类型转换 函数说明int(x [,base ])将x转换为一个整数float(x)将x转换为一个浮点数str(x)将对象 x 转换为字符串bool(x)将对象x转换成为布尔值转换成为整数 print(int("123")) # 123 将字符串转换成为整数 print(int(123.78)) # 123 将浮点数转换成为整数 …

腾讯云存储产品全线升级,满足更多高性能存储场景

数字经济时代,诞生了海量数据资源,促使数据存储技术也在不断推陈出新。12月1日,在2022腾讯全球数字生态大会存储专场上,腾讯云发布了多款云存储产品能力上新,并对分布式存储、高性能存储、日志大数据、云原生数据湖等产…

CMSIS hal库 标准库 pack(芯片支持包)

ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层 CMSIS英文全称Common Microcontroller Software Interface Standard,☞通用微控制器软件接口标准&a…

OAuth2.0介绍

1. OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本&#xff0…

【蓝桥杯选拔赛真题51】Scratch赛车训练 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch赛车训练 一、题目要求 编程实现 二、案例分析 1、角色分析

python解决 某文库禁用文段批量下载 并保存到文档

嗨害大家好鸭! 我是小熊猫鸭~ 大家是不是在写毕业论文的时候 需要参考某一段的内容 要用到复制粘贴,但是吧,某文库就需要付费, 就老难受了… 我们今天就来解决这个"老难受" 源码、资料点击此处 环境使用&#xff1…

项目实战案例丨教辅机构信息化平台跟着这个做

一. 基本简介 最近正值计算机专业的小伙伴忙着整理毕业设计,有不少童靴问辉哥,有没有合适的项目作为毕业设计项目。恰好辉哥这里就有一个适合作为毕设的项目,那么辉哥就写一篇文章,聊聊这个项目,希望可以对有需要的你…

照片怎么制作动态照片?这篇文章教会你如何制作

大家不知道有没有在网上刷到过一些本来是静态的照片,可照片里的局部却能够动起来的动态图片,我看完后觉得这种特效很神奇,既有趣又不会有违和感。那你想知道动态照片怎么制作吗?今天我就来给大家介绍一下制作动态图片的具体方法&a…

基于JWT用户认证分析

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个request请求时它就把刚刚的资料忘了。 于是我们的程序就不知道谁是谁,就要再验证一…

Spring Security 认证授权(一)

1.基本概念1.1.什么是认证 进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微…

大二毕设.1-学生信息管理系统

目录 技术选型: 功能概括: 可扩展性良好,添加其余操作无非是多加点信息,重复编码改数据罢 版本: 基本演示 功能实现讲解 登录校验 可调整每页条数的分页显示与增删查改 不会造成偷窃的部分web代码 技术选型: 前端: Vue Element UI后端: Spring…

喜报|众享链网荣获第二届中国可信区块链安全攻防大赛优秀案例奖

近日,第二届中国可信区块链安全攻防大赛决赛在成都成功举办并圆满落幕。经过预赛初审、预赛复审的层层选拔,众享链网脱颖而出,成功进入赛道三“原创自主区块链平台优秀应用案例评选比赛”总决赛环节,荣获优秀案例奖,入…

[附源码]计算机毕业设计的桌游信息管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…