zoukankan      html  css  js  c++  java
  • MongoDB安装和使用,MongoDB Like查询,Or查询,分页查询

    MongoDB安装和使用,MongoDB4.4最新安装和使用

    MongoDB Like查询

    MongoDB Or查询

    MongoDB 分页查询

    ================================

    ©Copyright 蕃薯耀 2021-06-18

    https://www.cnblogs.com/fanshuyao/

    一、MongoDb下载地址(需要注册登录):
    官网各种版本下载地址:

    https://www.mongodb.com/try/download/community

    4.4.6版本直接下载地址:

    https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-4.4.6-signed.msi

    4.2.14版本直接下载地址:

    https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.14-signed.msi

    二、MongoDB安装
    1、过程省略。

    注意:
    install mongoDB compass步骤时,去掉左下角的勾,不安装mongoDB compass,后面需要可自行下载安装。

    MongoDB Compass 是一个图形界面管理工具,下载地址:

    https://www.mongodb.com/download-center/compass

    三、MongoDB启动运行

    1、MongoDB4.4在安装完成后,已经自动生成服务并设置自启动,此时服务也已经启动
    安装完成后,MongoDB已经自动生成服务并已经启动:
    服务名称:MongoDB
    显示名称:MongoDB Server (MongoDB)

    D:softMongoDBServer4.4inmongod.exe --config "D:softMongoDBServer4.4inmongod.cfg" --service

    所以具体的配置看配置文件:

    D:softMongoDBServer4.4inmongod.cfg

    MongoDB数据存放目录配置:

    storage:
      dbPath: D:softMongoDBServer4.4data

    MongoDB日志存放目录配置:

    systemLog:
      destination: file
      logAppend: true
      path:  D:softMongoDBServer4.4logmongod.log

    浏览器打开:

    http://127.0.0.1:27017/

    进行测试

    It looks like you are trying to access MongoDB over HTTP on the native driver port.

    看到上面的信息就表示MongoDB启动成功!^_^

    2、MongoDB通过Zip压缩包安装运行(执行文件安装的,此步直接跳过)

    打开cmd,进入到MongoDB的bin目录,输入mongod命令

    d:
    cd D:softMongoDBServer4.4in
    mongod

    直接运行mongod会报错,原因是要手动创建MongoDb的数据存放目录(D:datadb,如果安装在C盘,则是:C:datadb):

    NonExistentPath: 未找到数据目录 D:\data\db\。
    创建丢失的目录或使用 (1) --dbpath 命令行选项指定另一个路径,
    或 (2) 通过在配置文件中添加 'storage.dbPath' 选项。

    NonExistentPath: Data directory D:\data\db\ not found. 
    Create the missing directory or specify another path using (1) the --dbpath command line option, 
    or (2) by adding the 'storage.dbPath' option in the configuration file.
    
    {
        "t": {
            "$date": "2021-06-02T11:12:45.209+08:00"
        },
        "s": "E",
        "c": "STORAGE",
        "id": 20557,
        "ctx": "initandlisten",
        "msg": "DBException in initAndListen, terminating",
        "attr": {
            "error": "NonExistentPath: Data directory D:\data\db\ not found. Create the missing directory or specify another path using (1) the --dbpath command line option, or (2) by adding the 'storage.dbPath' option in the configuration file."
        }
    }

    解决方案:
    在D:softMongoDB下创建目录datadb,即:D:softMongoDBdatadb
    指定--dbpath 和指定端口--port 27018 运行

    mongod --dbpath D:softMongoDBdatadb --port 27018
    {"t":{"$date":"2021-06-02T17:55:46.464+08:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27018,"ssl":"off"}}

    指定日志目录:--logpath
    查看版本:--version

    其它参数可以通过:mongod --help 查看

    四、打开MongoDB命令窗口

    进入MongoDB bin目录:

    D:softMongoDBServer4.4in

    双击:mongo.exe 打开MongoDB命令窗口

    输入命令

    show dbs;

    查看所有的数据库

    > show dbs;
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    test    0.000GB
    >

    输入命令db查看当前所在的数据库

    > db
    test

    五、利用工具连接MongoDB

    可以从官网下载:MongoDBCompass

    1、最简单的连接:

    mongodb://localhost
    mongodb://127.0.0.1

    指定端口,默认为27017

    mongodb://127.0.0.1:27017

    2、MongoDB标准 URI 连接语法:

    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

    带用户名和密码

    mongodb://sysop:moon@localhost

    带用户名、密码、具体的数据库名

    mongodb://sysop:moon@localhost/records

    分片集群

    mongodb://router1.example.com:27017,router2.example2.com:27017,router3.example3.com:27017/

    带Options参数

    mongodb://db1.example.net:27017,db2.example.net:2500/?replicaSet=test&connectTimeoutMS=300000

    六、MongoDB命令使用

    官方文档:

    https://docs.mongodb.com/manual/crud/

    1、查看当前操作的(文档)数据库

    > db
    test

    2、查看所有数据库

    > show dbs;
    
    admin   0.000GB
    config  0.000GB
    local   0.000GB

    3、直接简单运算

    > 2+2
    4

    4、插入数据

    > db.study.insert({a:"1",b:2,type:"1"});
    WriteResult({ "nInserted" : 1 })

    db.collection.insertOne() New in version 3.2
    db.collection.insertMany() New in version 3.2

    数据格式:

    {
        "_id": {
            "$oid": "60b7620ddda49c13110ec455"
        },
        "name": "66",
        "ages": {
            "$numberLong": "6"
        },
        "booleanFlag": false,
        "date": {
            "$date": "2021-06-01T16:00:00.000Z"
        },
        " time": {
            "$timestamp": {
                "t": 0,
                "i": 0
            }
        },
        "doubleFlag": 5.2,
        "arr": ["aa", "bb", "cc", "dd"],
        "bin": {
            "$binary": "",
            "$type": "1"
        },
        "number32": 2,
        "number64": {
            "$numberLong": "5"
        }
    }

    5、批量插入数据

    > db.study.insert([{name : "王多多", age : 35, type : "4"}, {name : "马哈哈", age : 35, type : "4"}]);
    
    BulkWriteResult({
            "writeErrors" : [ ],
            "writeConcernErrors" : [ ],
            "nInserted" : 2,
            "nUpserted" : 0,
            "nMatched" : 0,
            "nModified" : 0,
            "nRemoved" : 0,
            "upserted" : [ ]
    })
    制造测试数据:
    db.study.insert({name : "小明", age : 18, type : "1"});
    db.study.insert({name : "小陈", age : 19, type : "1"});
    db.study.insert({name : "小赵", age : 18, type : "1"});
    db.study.insert({name : "小钱", age : 17, type : "1"});
    db.study.insert({name : "小孙", age : 20, type : "1"});
    db.study.insert({name : "小李", age : 18, type : "1"});
    db.study.insert({name : "小马", age : 19, type : "1"});
    db.study.insert({name : "小红", age : 18, type : "2"});
    db.study.insert({name : "小芳", age : 18, type : "2"});
    db.study.insert({name : "赵老师", age : 30, type : "3"});
    db.study.insert({name : "钱老师", age : 31, type : "3"});
    db.study.insert({name : "孙老师", age : 30, type : "3"});
    db.study.insert({name : "李老师", age : 32, type : "3"});
    db.study.insert([{name : "王校长", age : 35, type : "4"}, {name : "马校长", age : 35, type : "4"}]);

    6、查看数据

    • 查看所有数据
    > db.study.find()
    {
    "_id" : ObjectId("60b72423d8f397500860a466"), "a" : "1", "b" : 2, "type" : "1" }
    • 根据属性查询
    db.study.find({age: 30})
    
    { "_id" : ObjectId("60b726540e8e53d3b7246f1a"), "name" : "赵老师", "age" : 30, "type" : "3" }
    { "_id" : ObjectId("60b726540e8e53d3b7246f1c"), "name" : "孙老师", "age" : 30, "type" : "3" }
    • in条件查询
    db.study.find({ age: { $in: [ 30 ,32] } })
    
    
    > db.study.find({ age: { $in: [ 30 ,32] } })
    { "_id" : ObjectId("60b726540e8e53d3b7246f1a"), "name" : "赵老师", "age" : 30, "type" : "3" }
    { "_id" : ObjectId("60b726540e8e53d3b7246f1c"), "name" : "孙老师", "age" : 30, "type" : "3" }
    { "_id" : ObjectId("60b726550e8e53d3b7246f1d"), "name" : "李老师", "age" : 32, "type" : "3" }
    • 小于条件查询
    db.study.find({ age: { $lt: 18} })
    
    
    > db.study.find({ age: { $lt: 18} })
    { "_id" : ObjectId("60b726530e8e53d3b7246f14"), "name" : "小钱", "age" : 17, "type" : "1" }


    其它比较符号
    $eq
    匹配等于指定值的值。

    $gt
    匹配大于指定值的值。

    $gte
    匹配大于或等于指定值的值。

    $in
    匹配数组中指定的任何值。

    $lt
    匹配小于指定值的值。

    $lte
    匹配小于或等于指定值的值。

    $ne
    匹配所有不等于指定值的值。

    $nin
    不匹配数组中指定的任何值。

    • Or条件查询
    db.study.find({ $or: [ { age: 18 }, { age: { $gt: 32} } ] })
    年龄为18或者年龄大于32的
    > db.study.find({ $or: [ { age: 18 }, { age: { $gt: 32} } ] })
    { "_id" : ObjectId("60b72565d8f397500860a467"), "name" : "王校长", "age" : 35, "type" : "4" }
    { "_id" : ObjectId("60b725e70e8e53d3b7246f0f"), "name" : "王校长", "age" : 35, "type" : "4" }
    { "_id" : ObjectId("60b725e70e8e53d3b7246f10"), "name" : "马校长", "age" : 35, "type" : "4" }
    { "_id" : ObjectId("60b7264f0e8e53d3b7246f11"), "name" : "小明", "age" : 18, "type" : "1" }
    { "_id" : ObjectId("60b726530e8e53d3b7246f13"), "name" : "小赵", "age" : 18, "type" : "1" }
    { "_id" : ObjectId("60b726530e8e53d3b7246f16"), "name" : "小李", "age" : 18, "type" : "1" }
    { "_id" : ObjectId("60b726540e8e53d3b7246f18"), "name" : "小红", "age" : 18, "type" : "2" }
    { "_id" : ObjectId("60b726540e8e53d3b7246f19"), "name" : "小芳", "age" : 18, "type" : "2" }
    • and查询再加上Or条件查询
    • db.study.find({ age:18, $or: [ { name: "小明" }, { name: "小芳" } ] })
      
      > db.study.find({ age:18, $or: [ { name: "小明" }, { name: "小芳" } ] }) { "_id" : ObjectId("60b7264f0e8e53d3b7246f11"), "name" : "小明", "age" : 18, "type" : "1" } { "_id" : ObjectId("60b726540e8e53d3b7246f19"), "name" : "小芳", "age" : 18, "type" : "2" }
    • like查询(正则表达式)

    右边Like查询
    以【王】开头,如like '王%'

    db.study.find({ name: /^王/})

    左边Like查询
    以【校长】结尾,如like '%校长'

    db.study.find({ name: /校长$/})
    
    > db.study.find({ name: /校长$/})
    { "_id" : ObjectId("60b72565d8f397500860a467"), "name" : "王校长", "age" : 35, "type" : "4" }
    { "_id" : ObjectId("60b725e70e8e53d3b7246f0f"), "name" : "王校长", "age" : 35, "type" : "4" }
    { "_id" : ObjectId("60b725e70e8e53d3b7246f10"), "name" : "马校长", "age" : 35, "type" : "4" }
    • 分页查询
    > db.study.find({age: 30}).limit(1)
    { "_id" : ObjectId("60b726540e8e53d3b7246f1a"), "name" : "赵老师", "age" : 30, "type" : "3" }

    db.study.find().skip(2).limit(2);
    skip为跳过的offset,如查询ID为21-30的数据,则是db.study.find().skip(20).limit(10);,跳过前面20条数据后取10条数据
    格式是:

    db.study.find().skip((currentPage-1) *pageSize).limit(pageSize);
    • 排序(升序或者倒序)
    db.study.find().skip(2).limit(2).sort({age: 1});
    
    db.study.find().limit(10).sort({age: -1, name : 1});
    db.study.find().sort({age: -1, name : 1}).limit(10);
    
    db.study.find().sort({age: -1, name : 1}).limit(10).skip(5);

    1表示升序,-1表示降序
    sort,limit,skip顺序随便放。

    7、更新update

    db.collection.updateOne() New in version 3.2
    db.collection.updateMany() New in version 3.2
    db.collection.replaceOne() New in version 3.2

    将名称
    { "_id" : ObjectId("60b72565d8f397500860a467"), "name" : "王校长", "age" : 35, "type" : "4" }
    更新为朱校长

    更新数据(一定要使用$set,不然更新后,只剩下这个属性。)

    db.study.updateOne({ _id : ObjectId("60b72565d8f397500860a467")}, {$set: {name : "朱校长"}})
    
    > db.study.updateOne({ _id : ObjectId("60b72565d8f397500860a467")}, {$set: {name : "朱校长"}})
    { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

    更新后查询验证:

    db.study.find({ _id : ObjectId("60b72565d8f397500860a467")});
    
    > db.study.find({ _id : ObjectId("60b72565d8f397500860a467")});
    { "_id" : ObjectId("60b72565d8f397500860a467"), "name" : "朱校长", "age" : 35, "type" : "4" }

    更新数据(不加$set)

    db.study.updateOne({ "_id" : ObjectId("60b72565d8f397500860a467")}, {name : "朱校长2"})
    
    > db.study.updateOne({ "_id" : ObjectId("60b72565d8f397500860a467")}, {name : "朱校长2"})
    uncaught exception: Error: the update operation document must contain atomic operators :
    DBCollection.prototype.updateOne@src/mongo/shell/crud_api.js:565:19

    8、更新,$inc 对数字增减

    //小赵年龄加一岁
    db.study.update({_id: ObjectId("60b726530e8e53d3b7246f13")}, {$inc : {age: 1}});
    
    //小赵年龄减3岁
    db.study.update({_id: ObjectId("60b726530e8e53d3b7246f13")}, {$inc : {age: -3}});

    七、MongoDB连接参数说明


    标准连接语法:

    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

    mongodb://
    一个必需的前缀,用于标识这是标准连接格式中的字符串。

    username:password@
    可选的。身份验证凭据。
    如果指定,客户端将尝试向authSource. 如果 authSource未指定,客户端将尝试向defaultauthdb. 如果defaultauthdb未指定,则到admin 数据库。

    host[:port]
    运行mongod实例(或分片mongos集群的实例)的主机(和可选端口号) 。您可以指定主机名、IP 地址或 UNIX 域套接字。为您的部署拓扑指定尽可能多的主机:
    对于独立的,指定独立mongod实例的主机名 。
    对于副本集,指定mongod 副本集配置中列出的实例的主机名。
    对于分片集群,指定mongos实例的主机名 。
    如果未指定端口号,27017 则使用默认端口。

    /defaultauthdb
    可选的。如果连接字符串包含username:password@ 身份验证凭据但未authSource指定选项,则要使用的身份验证数据库。
    如果两个authSource和defaultauthdb未指定,客户端将尝试以指定用户的身份验证admin数据库。

    ?<options>
    可选的。将连接特定选项指定为<name>=<value>成对的查询字符串。有关这些选项的完整说明,请参阅 连接字符串选项。
    如果连接字符串未指定数据库/您必须/在最后一个host和?开始选项字符串的问号 ( )之间指定斜线 ( ) 。


    options连接选项是成对的,形式如下:name=value.

    name使用驱动程序时,该选项不区分大小写。
    name使用 4.2 或更高版本的mongoshell时,该选项不区分大小写。
    name使用 4.0 及更早版本的mongoshell时,该选项区分大小写。
    value始终是区分大小写的。


    MongoDB连接options参数:

    replicaSet
    指定的名称副本集,如果 mongod是副本集的成员。
    连接到副本集时,向uri的组件提供副本集成员的种子列表host[:port]。有关特定详细信息,请参阅您的驱动程序 文档。
    mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=myRepl


    tls
    为连接启用或禁用 TLS/SSL(4.2版中的新功能。):
    true: 启动与 TLS/SSL 的连接。DNS 种子列表连接格式的默认设置 。
    false:在没有 TLS/SSL 的情况下启动连接。标准连接字符串格式的默认值 。
    mongodb://db0.example.com,db1.example.com,db2.example.com/?replicaSet=myRepl&tls=true
    或者,您也可以使用等效ssl=true选项:
    mongodb://db0.example.com,db1.example.com,db2.example.com/?replicaSet=myRepl&ssl=true


    tlsCertificateKeyFile
    指定.pem包含客户端的 TLS/SSL X.509 证书或客户端的 TLS/SSL 证书和密钥的本地文件的位置。
    客户端将此文件提供给 mongod/mongos实例。
    改变版本4.4:mongod/mongos如果出现的X.509证书内到期登录连接警告30 的日子mongod/mongos主机系统的时间。有关更多信息,请参阅 x.509 证书即将到期触发警告。
    并非所有驱动程序都支持此选项。请参阅 驱动程序文档。
    此连接字符串选项不适用于mongo shell。请改用命令行选项。
    4.2版中的新功能。


    tlsCertificateKeyFilePassword
    指定用于解密 tlsCertificateKeyFile.
    并非所有驱动程序都支持此选项。请参阅 驱动程序文档。
    此连接字符串选项不适用于mongo shell。请改用命令行选项。
    4.2版中的新功能。


    connectTimeoutMS
    超时前尝试连接的时间(以毫秒为单位)。默认是永不超时,但不同的驱动程序可能会有所不同。

    socketTimeoutMS
    在尝试超时之前尝试在套接字上发送或接收的时间(以毫秒为单位)。默认是永不超时,但不同的驱动程序可能会有所不同。

    compressors
    逗号分隔的压缩器字符串,用于启用网络压缩以在此客户端和mongod/mongos 实例之间进行通信。
    您可以指定以下压缩器:
    snappy
    zlib(在 MongoDB 3.6 或更高版本中可用)
    zstd(在 MongoDB 4.2 或更高版本中可用)
    如果您指定多个压缩器,那么您列出压缩器的顺序和通信发起者一样重要。例如,如果客户端指定以下网络压缩器"zlib,snappy"并mongod指定 "snappy,zlib", 客户端和mongod使用之间的消息 zlib。

    zlibCompressionLevel
    如果使用zlib for ,则指定压缩级别的整数 network compression。
    您可以指定范围从-1到的整数值9:
    -1:默认压缩级别,通常是级别6压缩。
    0:无压缩
    1 - 9:提高压缩级别,但以速度为代价,具有:1 提供最佳速度但最少压缩,以及9 提供最好的压缩,但速度最慢。


    maxPoolSize
    连接池中的最大连接数。默认值为100。

    minPoolSize
    连接池中的最小连接数。默认值为0。
    minPoolSize并非所有驱动程序都支持该选项。有关驱动程序的信息,请参阅 驱动程序文档。

    maxIdleTimeMS
    连接在被移除和关闭之前可以在池中保持空闲的最大毫秒数。
    并非所有驱动程序都支持此选项。

    waitQueueMultiple
    驱动程序将该maxPoolSize 值乘以的数字,以提供允许等待连接从池中可用的最大线程数。有关默认值,请参阅驱动程序 文档。
    并非所有驱动程序都支持此选项。

    waitQueueTimeoutMS
    线程可以等待连接变为可用的最长时间(以毫秒为单位)。有关默认值,请参阅 驱动程序文档。
    并非所有驱动程序都支持此选项。


    w
    对应于写关注wOption。该w选项请求确认写入操作已传播到指定数量的mongod实例或 mongod具有指定标签的实例。
    您可以指定 a number、字符串majority或 a tag set。

    wtimeoutMS
    对应写关注wtimeout。 wtimeoutMS指定写入问题的时间限制(以毫秒为单位)。
    当wtimeoutMSis 时0,写操作永远不会超时。有关更多信息,请参阅wtimeout。

    journal
    对应于写关注j选项选项。该 journal选项请求 MongoDB 确认写入操作已写入 日志。有关详细信息,请参阅j选项。
    如果设置journal为true,并指定一个w小于 1的 值,journal则以。
    如果您设置journal为 true,并且 mongod没有启用storage.journal.enabled日记功能(如 ) ,那么 MongoDB 将出错。


    readConcernLevel
    隔离级别。可以接受以下值之一:

    • local
    • majority
    • linearizable
    • available

    此连接字符串选项不适用于 mongoshell。将读取问题指定为特定操作的 选项。

    (时间宝贵,分享不易,捐赠回馈,^_^)

    ================================

    ©Copyright 蕃薯耀 2021-06-18

    https://www.cnblogs.com/fanshuyao/

     
    今天越懒,明天要做的事越多。
  • 相关阅读:
    阿里云的使用运维安装
    阿里云的使用运维安装
    promis:异步编程
    promis:异步编程
    微信开发笔记
    细数那些带打赏功能的平台
    细数那些带打赏功能的平台
    Java Web Services (0)
    4、查询(2)
    COGS——C610. 数对的个数
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14900195.html
Copyright © 2011-2022 走看看