NoSQL -- 3.MongoDB插入和查询操作

MongoDB插入和查询操作

在命令里面加了注释,以便更好的阅读

插入文档

通过Mongo往MongoDB指定集合里插入文档,在TRDB里相当于往表里插入记录,但是MongoDB不需要预先对数据存储结构进行定义,用插入命令往数据库文件里写入数据的同时就自动建立相关内容。

语法:db.collection.insert()

在集合里插入一条或者多条文档,db为数据库名,默认为当前数据库。collection为集合名,insert为插入文档命令。

  • 插入一条简单文档

    > use goodsdb
    switched to db goodsdb
    > db.goodsbaseinf.insert( //在集合goodsbaseinf里面插入了一条数据
         {name:"MongoDB教程",price:32}
     )
    WriteResult({ "nInserted" : 1 })
    > db.goodsbaseinf.find() //显示集合内容,后续会说到
    { "_id" : ObjectId("5f6c45c04950ca21722fb49b"), "name" : "MongoDB教程", "price" : 32 }
    

    当我们使用insert没定义id时,会自动给我们生成一个_id值

    插入其实有两种写法:

    • db.conllection.insert()

      若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

    • db.conllection.save()

      如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne()db.collection.replaceMany() 来代替。

    当然我们也可以用变量方式来插入文档。

    >document = ({name:"MongoDB教程",price:32})
    >db.goodsbaseinf.insert(document)
    
  • 插入一条复杂的文档

    > db.goodsbaseinf.insert(
         {
             name:"MongoDB零基础教学",
             bookprice:11.2,
             adddate:2020-09-24,
             allow:true,
             baseinf:{
                 ISBN:11245124544,press:"成理工程出版社"
             },
             tags:["good","book","it","Program"]
         }
     )
    

    insert里面可以嵌套文档,这样可以避免TRDB里的多表关联(join)运算。

  • 插入多条有序文档

    db.goodsbaseinf.remove({}) //删除一个集合中的所有数据
    db.goodsbaseinf.insert(
        {
            _id:13,item:"大学生教材", name:"《大学英语》",price:32
        }
    )
    db.goodsbaseinf.insert(
        [
            {
                _id:13,item:"大学生教材", name:"《高等数学上册》",price:32
            },
            {
                _id:15,item:"大学生教材", name:"《高等数学下册》",price:33
            },
            {
                _id:14,item:"大学生教材", name:"《大学物理》",price:34
            }
        ],
        {
            ordered:true
        }
    )
    

现在我们goodsbaseinf这个集合里面有"_id:13"的文档记录,那么执行上面的多条插入会失败,在ordered:true的情况下,不能和已有的id冲突,如果有则全部失败;ordered:fasle的情况下,除了出错记录以外的数据都能够插入。

  • 简化的插入命令

    1. db.collection.insertOne()

      >document = ({name:"MongoDB教程",price:32})
      >db.goodsbaseinf.insertOne(document)
      {
              "acknowledged" : true,
              "insertedId" : ObjectId("5f6c536a74d392978dcd0d1f")
      }
      // 该命令保证程序员插入的是一条文档,不能插入多条文档
      
    2. db.collection.insertMany()

      >db.goodsbaseinf.remove({})
      >documents = ([{
                  _id:13,item:"大学生教材", name:"《高等数学上册》",price:32
              },
              {
                  _id:15,item:"大学生教材", name:"《高等数学下册》",price:33
              },
              {
                  _id:14,item:"大学生教材", name:"《大学物理》",price:34
              }])
      >db.goodsbaseinf.insertMany(documents)
      { "acknowledged" : true, "insertedIds" : [ 13, 15, 14 ] }
      
查询文档

MongoDB 查询文档使用 find() 方法。

find() 方法以非结构化的方式来显示所有文档

db.collection.find(query, projection)

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
  • 查询指定集合所有文档

    db.goodsbaseinf.find()//不美观
    db.goodsbaseinf.find().pretty()//美观
    
  • 等价查询条件

    > db.goodsbaseinf.find(
         {
             name:"《大学物理》",
             price:34
         },
         {
             name:1,price:1,_id:0
         }
     )
    { "name" : "《大学物理》", "price" : 34 }
    

    公共查询条件:{< key1 >:< value1 >,< key2 >,< value2 >…},相当于SQL里面的and语法。

    如果不显示id值,就需要在后面指定,1或者true表示显示,0或者false表示不显示。

  • 嵌套查询

    db.goodsbaseinf.find(
        {
            "baseinf.press":"成理工程出版社"
        }
    )
    

    使用这个查询之前,需要用到插入一条复杂的文档的例句,因为在中间过程中,删除了前面的数据,下面的也是如此

  • 数据查询

    db.goodsbaseinf.find(
        {
            tags:["good","book","it","Program"]
        }
    )//等价查询某一数组
    db.goodsbaseinf.find(
        {
            tags:"good"
        }
    )//查询数组里的某一个值
    db.goodsbaseinf.find(
        {
            tags:{$size:4}
        }
    )//查询有四个元素的数组
    
  • limit和skip方法查询

    db.goodsbaseinf.find().limit(k) //返回前k条文档
    db.goodsbaseinf.find().skip(k)  //显示第k+1条开始的文档
    
  • 带$ or和$ in运算符的查询

    db.goodsbaseinf.find(
        {
            $or:[ 
                {name:"《高等数学上册》"},
                {name:"《高等数学下册》"}
                ]
        }
    )
    db.goodsbaseinf.find(
        {
           name:{
               $in:["《高等数学上册》", "《高等数学下册》"]
           }
        }
    )
    
    • $or直接查询键值对相同的文档记录
    • $in指定查询指定查询键,然后&in里面输入要查找的值。
  • 通过查询操作符来查询

操作格式范例RDBMS中的类似语句
等于{<key>:<value>}db.goodsbaseinf.find({"by":"CSDN"}).pretty()where by = 'CSDN'
小于{<key>:{$lt:<value>}}db.goodsbaseinf.find({"likes":{$lt:50}}).pretty()where likes < 50
小于或等于{<key>:{$lte:<value>}}db.goodsbaseinf.find({"likes":{$lte:50}}).pretty()where likes <= 50
大于{<key>:{$gt:<value>}}db.goodsbaseinf.find({"likes":{$gt:50}}).pretty()where likes > 50
大于或等于{<key>:{$gte:<value>}}db.goodsbaseinf.find({"likes":{$gte:50}}).pretty()where likes >= 50
不等于{<key>:{$ne:<value>}}db.goodsbaseinf.find({"likes":{$ne:50}}).pretty()where likes != 50
db.goodsbaseinf.find(
    {
        price:{$gte:32}
    }
)//查询价格大于等于32的值

db.goodsbaseinf.find(
    {
        price:{$gt:3, $lt:33}
    }
)//查询价格范围(3,33)的值

db.goodsbaseinf.find(
    {
        $or:[ 
            {price:{$gt:33}},
            {price:{$lt:33}}
            ]
    }
)//查询价格范围小于33和大于33的值

当然还有许多正则表达式,后续更新。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空皓月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值