zoukankan      html  css  js  c++  java
  • MongoDB入门实战教程(4)

    通过前面几篇的铺垫,我们基本了解了MongoDB是个什么东西,搭建起了一个MongoDB的小集群环境。接下来,我们就来学习一下MongoDB的基本操作。

    1 insert操作

    我们都知道对于传统关系型数据库,通常会使用SQL来进行基本操作。而对于MongoDB来说,通常则会使用MQL来进行基本操作。

    首先,我们来看看如何插入新数据,MongoDB为我们提供了插入单个和多个文档的接口。

    插入单个文档:db.<collectionName>.insertOne

    db.teams.insertOne({name:"cscec-football-team", members:22});

    插入多个文档:db.<collectionName>.insertMany

    db.teams.insertMany([
      {name:"yzw-football-team", members:22},
      {name:"yzw-basktellball-team", members:15},
      {name:"yzw-outting-team", members:30}
      ]);

    2 find操作

    查询操作(find)初步

    在关系型数据库中,我们最常用的操作就是select,对于MongoDB则是find。需要注意的是,find返回的是游标。

    查询所有数据:db.<collectionName>.find

    db.teams.find(); -- 未格式化
    db.teams.find().pretty(); -- 格式化

    如果你使用的是navicat,可以切换一下展现形式看看。

    查询带条件的数据:db.<collectionName>.find(filter)

    -- 单个条件
    db.teams.find({"members":22});
    -- 多个条件的and(类似于SQL中的and)
    db.teams.find({"members":22, "name":"yzw-football-team"});
    -- 上面也等价于
    db.teams.find({$and:[{"members":22, "name":"yzw-football-team"}]});
    -- 多个条件的or(类似于SQL中的or)
    db.teams.find({$or:[{"members":22, "name":"yzw-football-team"}]});
    -- 按照正则表达式查找
    db.teams.find({"name":/^ball/});

    查询操作(find)进阶搜索

    在MQL中,传统SQL中的查询条件如>, <, !=等操作符有了不一样的表述:

    -- 找到人数>20的team
    db.teams.find({"members":{$gt:20}});
    -- 找到人数<20的team
    db.teams.find({"members":{$lt:20}});
    -- 找到人数>=20的team
    db.teams.find({"members":{$gte:20}});
    -- 找到人数<=20的team
    db.teams.find({"members":{$lte:20}});
    -- 找到人数!=20的team
    db.teams.find({"members":{$ne:20}});

    下面是查询条件的一个对照表:

     

    如果需要查询某个字段是NULL?又或者如何实现SQL中的IN呢?

    -- name IS NULL
    db.teams.find({"name":{$exists:false}});
    -- name IS NOT NULL
    db.teams.find({"name":{$exists:true}});
    -- members IN(11,22,30)
    db.teams.find({"members":{$in:[11,22,30]}});
    -- members NOT IN(11,22,30)
    db.teams.find({"members":{$nin:[11,22,30]}});

    下面是查询逻辑的一个对照表:

     

    查询操作(find)子文档搜索

    在MQL中,可以支持我们使用"字段.子字段名"的形式来查询子文档:

    -- 填充测试数据
    db.products.insertOne({name:"YZ.JC", description:{country:"China", province:"Chengdu"}});
    -- 查询子文档
    db.products.find({"description.country":"China"});

    查询操作(find)数组搜索

    在MQL中,可以支持我们搜索数组中的元素:

    -- 填充数据
    db.products.insertMany([
      {name:"Walkman", color:["white","gray"]},
      {name:"CD Player", color:["black","yellow"]}
      ]);
    -- 查询color为white的
    db.products.find({color:"white"});
    -- 查询color为white或者black的
    db.products.find({$or:[{color:"white"},{color:"black"}]});

     在MQL中,也可以支持我们搜索数组中的对象:

    -- 填充数据
    db.games.insertOne({
      "title":"Winning Eleven 2021",
      "versions":[
        {"language":"English", "code":"US", "market":"NorthAmerica"},
        {"language":"Chinese", "code":"CN", "market":"China"},
        {"language":"Japanese", "code":"JP", "market":"Japan"}
      ]
    });
    -- 搜索子对象的market是Japan的
    db.games.find({"versions.market":"Japan"});
    -- 搜索子对象的market是China且code是CN的
    db.games.find({"versions.market":"China","versions.code":"CN"});
    -- 使用elemMatch:必须同一个子对象满足多个条件
    db.games.find({"versions":{$elemMatch:{"market":"China","code":"CN"}}});

    查询操作(find)控制返回字段

    在MQL中,find操作可以指定只返回指定的字段,即所谓的投影操作(projection),需要注意的是:_id字段必须明确指明不返回,否则默认会返回。操作实例如下:

    -- 指明不返回_id,且只返回name字段
    db.teams.find({"members":{$gte:10}},{"_id":0, name:1});
    -- 不指明是否返回_id则默认返回,且只返回name字段
    db.teams.find({"members":{$gte:10}},{name:1});
    -- 它其实等价于
    db.teams.find({"members":{$gte:10}},{"_id":1, name:1});

    3 update操作

    在MQL中,update操作的格式为:db.<collectionName>.update。

    假设这里要实现更新yzw-football-team的members为22人:

    db.teams.updateOne({name:"yzw-football-team"},{"$set":{members:29}});

    需要注意的是:使用 updateOne 无论条件匹配多少个记录,它都只会更新第一条。有点类似于.NET中的FirstOrDefault()方法。

    同时,MQL还提供了 updateMany 方法以支持同时更新多个满足条件的文档,例如这里将所有人数为22人的team的名字都改为yzw-football-team:

    db.teams.updateMany({members:22},{"$set":{name:"yzw-football-team"}});

    除此之外,还可以使用 update 来更新数组:

    使用$push即可增加一个对象到数组底部:

    db.games.update({title:"Winning Eleven 2021"},
      {"$push": 
      { 
         versions:{"language": "Korean","code": "KO", "market": "South Korea"} 
      }});

    此外,还可以使用$pushAll即可增加多个对象到数组底部,使用$pop来从数组底部删除一个对象,使用$addToSet来实现如果不存在则新增一个值到数组等等。这里,就不再展示示例了。

    4 remove操作

    在MQL中,删除文档的命令格式为:db.<collectionName>.remove,一般情况下它需要配合查询条件来使用,否则它会删除所有文档(慎用)。

    remove操作示例:

    db.teams.remove({name:"yzw-football-team"}); // 删除name为yzw-football-team的文档
    db.teams.remove({members:{"$lt":22}}); // 删除members小于22人的文档
    db.teams.remove({}); // 删除所有文档,慎用

    5 drop操作

    在MQL中,删除集合的命令格式为:db.<CollectionName>.drop()。

    使用此命令,集合中的全部文档都会被删除,集合相关的索引也会被删除

    例如,我们将teams这个集合删除:

    db.teams.drop(); // 慎用

    那么,如何删除某个数据库呢?可以使用 db.dropDatabase() 来删除数据库,需要注意的是 数据库响应文件也会被删除,磁盘空间会得到释放。

    use studentsDB
    db.dropDatabase(); // 慎用

    6 总结

    本文总结了MongoDB的基本操作,包括了insert、find、remove、update和drop。学会这些基本操作,我们就可以应对大部分的常见使用场景了。

    下一篇,我们会学习如何通过.NET应用程序访问和操作MongoDB。

    参考资料

    唐建法,《MongoDB高手课》(极客时间)

    郭远威,《MongoDB实战指南》(图书)

    △推荐订阅学习

  • 相关阅读:
    Java消息队列--JMS概述
    Java消息队列--ActiveMq 初体验
    tomcat 日志禁用
    解决Tomcat catalina.out 不断成长导致档案过大的问题
    CentOS防火墙iptables-config的相关配置参数详解
    关于centos7下/etc/sysconfig/目录没有iptables问题
    死磕nginx系列--nginx 限流配置
    Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
    Android第一个个人APP(帐号助手)
    HDU 2896 病毒侵袭 (AC自己主动机)
  • 原文地址:https://www.cnblogs.com/edisonchou/p/mongodb_learning_summary_part4.html
Copyright © 2011-2022 走看看