Mongodb(1)—基本CRUD操作

在Mongodb中存在3个概念:

概念 作用
数据库 数据库是一个仓库,在仓库中可以存放集合
集合 集合类似于数组,在集合中可以存放文档
文档 文档是数据库中最小单位,我们存储和操作的内容都是文档

即一个数据库中存在多个集合,一个集合中存在多个文档。

在mongodb中,数据库和集合都不需要手动创建。在创建文档时,如果文档所在的集合和数据库不存在,将自动创建。

常用命令:

show dbs;  //显示所有的数据库
db;  //显示所在的数据库
use st;  //创建并切换数据库
show collections; //显示数据库中所有的集合
db.st1.insert({"xx":"1232"}); //创建文档st1

一、简单操作

1. 插入对象

语法:db..insert(doc); 插入一个或多个文档。
等效于:
db..insertOne();插入一个文档。
db.collection.insertMany();插入多个文档。
上述这两个方法语义更加清晰。注意,这两个方法均是3.2版本后新增方法。

当向集合中插入文档时,如果没有给指定_id属性,则数据库会自动给文档添加_id。该属性用来作为文档的唯一标识。

//插入一条数据
db.stus.insert({"name":"小猪",age:28,gender:"难"});
//插入多条数据
db.stus.insert([{"name":"数组1",age:28,gender:"女"},{"name":"数组2",age:29,gender:"女"}]);
//查看数据
db.stus.find();
插入结果.png

2. 查询操作

语法:db..find();查询集合中所有符合条件的文档。find可以接受对象作为条件参数。

默认情况下find()方法无参{}是查询所有对象。

2.1 查询特定属性的对象

db.stus.find({name:"小猪"});
查询结果.png

2.2 查询集合中符合条件的第一个文档

db.stus.findOne({name:"小猪"});

findOne直接返回的是一个对象。而find返回的是一个数组。
注意,db.stus.find({name:"小猪"})[0];可以选择数组中具体的对象。

image.png

2.3 统计查询数量

db.stus.find({age:28}).count();
返回查询结果.png

3. 修改操作

语法:db..update()(查询条件,修改后的新对象);。
在Mongodb3.2之后,新增3个语法来取代update语法

  • replaceOne():替换一个文档
  • updateOne():修改一个文档
  • updateMany():修改多个文档

3.1 替换一个文档

db.stus.update({name:"小猪"},{age:28});

等效于:

db.stus.replaceOne({name:"小猪"},{age:28});

将name为小猪的文档使用{age:28}去替换。

3.2 修改指定的属性

语法:$set

db.stus.update(
   {"_id":ObjectId("5e64cb476ef8da42f1854b0f")}, 
   {
    $set:{"name":"小白兔",gender:"女"}
   }
);

修改_id为"5e64cb476ef8da42f1854b0f"的文档的name属性和gender属性。若name或者gender不存在,那么将新增该属性。

db.stus.update(
   {name:"小白兔"}, 
   {
    $set:{"age":12,gender:"女"}
   }
);

修改name为"小白兔"的文档的age和gender属性。

3.3 删除指定属性

语法:$unset

db.stus.update(
   {name:"小白兔"}, 
   {
    $unset:{gender:"女"}
   }
);
可以看到指定的属性已经被删除.png

3.4 修改多个符合条件的值

db..update(),默认情况下只会修改一个文档(即使存在多个符合条件的值)。

但是可以配置db..update()去修改多个记录。

db.stus.updateMany(
   {gender:"女"}, 
   {
     $set:{age:13}
   },
   {
      multi:true  //可以修改多条记录
   }
);
update去修改多条记录.png

db..updateMany()可以修改多个符合条件的文档。

db.stus.updateMany(
   {gender:"女"}, 
   {
    $set:{age:11}
   }
);

4. 删除操作

语法:
db..remove(); 既可以删除一个文档,也可以删除多个文档
db..deleteOne(); 删除一个文档
db..deleteMany();删除多个文档

db.stus.remove({_id:ObjectId("5e64cb476ef8da42f1854b0f")})

注意:remove默认情况下删除多个文档。

//第二个参数为true,即删除一个参数。
db.stus.remove({gender:"女"},true);

注意:如果传递{}作为参数,那么会清空集合中的所有文档(性能差,因为先匹配在删除)。

若是清空集合,推荐使用db..drop();

若是删除数据库db.dropDatabase();

二、复杂语法

db.inventory.insert([  
  {item: "小兔", qty: 25, tags: ["黑", "白","灰"], size: { h: 23, w: 21, uom: "cm" }}, 
  {item: "大狼", qty: 25, tags: ["黑", "灰"], size: { h: 19, w: 22.85, uom: "cm" }},  
  {item: "小鸟", qty: 25, tags: ["蓝"], size: { h: 19, w: 22.85, uom: "cm" }}
  ])
插入多个复杂对象.png

2.1 关系条件进行查询

  • 使用$in操作符进行范围查询。
db.inventory.find({tags:{$in:["白","蓝"]}});
image.png
  • 多个查询条件使用,表示AND关系。
db.inventory.find({item:"小兔",qty:{$lt:30}});

等效于:

select * from inventory where item="小兔" and qty<30;
  • 使用$or操作符表示后面数组中的条件是或者关系。
  db.inventory.find({
  $or:[
    {item:"小兔"},
    {qty:{$gt:22}}
    ]});

等效于:

select * from inventory where item="小兔" and qty>22;
  • 联合使用ANDOR关系
  db.inventory.find({
  tags:"黑",
  $or:[
    {item:"小兔"},
    {qty:{$gt:22}}
    ]});

等效于:

select * from inventory where tags="黑" AND (item="小兔" or qty>22);
最终结果.png

2.2 对数组进行查询

  //清空记录
  db.inventory.remove({});
  //重新插入
  db.inventory.insert([  
    {item: "小兔", qty: 25, tags: ["黑", "灰","白"], dim_cm: [ 14, 21 ] }, 
    {item: "大狼", qty: 25, tags: ["黑", "灰"], dim_cm: [ 10, 22 ]},
    {item: "大象", qty: 25, tags: ["灰", "黑"], dim_cm: [ 14, 25 ]},  
    {item: "小鸟", qty: 25, tags: ["黑"], dim_cm: [ 5, 9 ]}
  ]);

2.2.1 匹配数组

  • 默认情况下,匹配会要求顺序和个数,下列查询语句要求匹配的文档的tags属性参数和顺序必须相同。
  db.inventory.find({
    tags:["黑","灰"]  //该条件是一个数组,查询的数据需要和该数组顺序相同
  });
最终只查询到一条数据.png
  • 使用$all操作符表示取消匹配顺序和个数,只要包含条件中的两个参数的文档,均符合要求。
  db.inventory.find({
    tags:{
       $all:["黑","灰"]
         }  
    });
查询到3条数据.png

2.2.2 多条件查询数组

  • 默认情况下,多条件查询一个数组。文档内的数组一个元素满足所有条件,也可以是每个元素只满足一部分条件但加起来满足所有条件。
  db.inventory.find({
    dim_cm:{$gt:22,$lt:25}  
  });
默认情况.png
  • 使用$elemMatch操作符表示要求数组中至少一个元素满足所有条件。
  db.inventory.find({
    dim_cm:{$elemMatch:{$gt:9,$lt:13}}
  });
image.png
  • 使用"数组属性名.下标"指定数组某一位要满足条件,下标从0开始。

注意:使用.时json的属性名必须是字符串。

  db.inventory.find({
    "dim_cm.0":{$eq:14}
  });
image.png
  • 使用$size表示要求数组长度满足某条件
  db.inventory.find({
    tags:{$size:1}
  });
image.png

2.3 对内联文档数组查询

  db.inventory.remove({}); 
  db.inventory.insert([  
    {item: "tom", instock:[{name:"小猪",age:12},{name:"小狗",age:9}] }, 
    {item: "jerry", instock:[{name:"小鸟",age:2},{name:"小鸡",age:3}] }, 
    {item: "joor", instock:[{name:"小猪",age:12},{name:"小鸡",age:3}] },
    {item: "panner", instock:[{name:"小鱼",age:1},{name:"小狗",age:9}] }
    ]);
  • 可以通过直接指定查询一个元素的方式对内联文档数据进行查询。
    db.inventory.find({
        instock:{name:"小猪",age:12}
       });

但是需要注意:顺序或者个数与内联数组的属性不匹配时,均不能匹配。

内联数组对象属性顺序不匹配时不能进行匹配.png
属性不全时不能进行匹配.png
  • 通过内联文档属性进行查询

通过内联文档属性进行查询,会返回数组中至少有一个元素满足匹配的文档。

若文档中内联文档数组中某个对象的age小于等于2,那么就返回。

    db.inventory.find({
        "instock.age":{$lte:2}
       });
最终返回结果.png

指定数组某位置的元素属性满足的条件。

    db.inventory.find({
        "instock.1.age":{$lte:3}
       });
image.png
  • 指定多条件进行查询
  1. 对内联文档数组指定多条件查询时,只要求数组中所有元素任意匹配满足所有条件,而不必有一个元素满足所有条件。
    因为数据中不存在12岁的小狗,但是tom中有一个12岁的小猪9岁的小狗。根据上述语法,可以查询出对应的内容。
    db.inventory.find({
        "instock.age":12,"instock.name":"小狗"
       });
image.png
  1. 可以使用$elemMatch要求数组中至少存在一个元素满足所有的条件。
    db.inventory.find({
        "instock":{$elemMatch:{"age":9,"name":"小狗"}}
       });

推荐阅读

官方文档

MongoDB的安装及其CRUD操作

你可能感兴趣的:(Mongodb(1)—基本CRUD操作)