MongoDB(二)-- Read

本文深入探讨了MongoDB的读取操作,包括匹配查询、查询操作符如等于、不等于等比较操作,逻辑操作符如AND、OR、NOT,以及字段、数组和运算操作符。此外,还介绍了文档游标的概念,如何进行排序、限制和跳过,以及文档投影用于选择性地返回部分字段。最后,讨论了如何在数组字段上进行投影,包括选择特定数量或满足条件的元素。
摘要由CSDN通过智能技术生成

读取文档

  • db.<collection>.find()
  • 匹配查询
  • 查询操作符
  • 游标
    • 查询操作返回的结果游标
    • 游标的迭代与操作
  • 投射
    • 只返回部分字段
    • 内嵌文档的投射
    • 数组的投射
匹配查询
  • db.<collection>.find(<query>,<projection>)
    • <query>定义了读取操作时筛选文档的条件

    • <projection>定义了对读取结果进行的投射操作

       > db.accounts.find({name:"alice"})
       { "_id" : "account1", "name" : "alice", "balance" : 100 }
      
       复合主键的匹配查询
       >db.accounts.find({"_id.type":"saving"})
      
查询操作符
  • 比较操作符

    • {<field>:{$<operator>:<value>}}

    • $<operator>$eq$ne$gt$gte$lt$lte$in$nin

      >db.accounts.find({"name":{$ne:"alice"}})
      需要注意的是,$ne也会筛选出并不包含查询字段的文档,即这个文档没有<field>字段,该文档也会被筛选出来
      
    • $in  匹配字段值与任一查询值相等的文档

    • $nin  匹配字段值与任何查询值都不等的文档

      >db.accounts.find({"name":{$nin:["alice","ben","bob"]}})
      需要注意的是,和$ne一样,$nin也会筛选出并不包含查询字段的文档
      
  • 逻辑操作符

    • $not  筛选条件不成立的文档
      • {field:{$not:{<operator-expression>}}$not也和$ne一样同样会筛选出不包含查询字段的文档
    • $and  匹配多个筛选条件全部成立的文档
      • {$and:[{<expression1>},{<expression2>},...]}
    • $or  匹配至少一个筛选条件成立的文档
    • $nor  匹配筛选条件全都不成立的文档,需要注意的是,和$ne一样,$nor也会筛选出并不包含查询字段的文档
  • 字段操作符

    • $exists  匹配包含查询字段的文档
      • {field:{$exists:<boolean>}}
    • $type  匹配字段类型复合查询值的文档
      • {field:{$type:<BSON type>}}
      • {field:{$type:[<BSON type1>,<BSON type2>,...]}}
  • 数组操作符

    • $all  匹配数组字段中包含所有查询值的文档
      • {field:{$all:[<value1>,<value2>,...]}}
    • $elemMatch  匹配数组字段中至少存在一个值满足筛选条件的文档
      • {field:{$elemMatch:{<query1>,<query2>,...}}}
  • 运算操作符

    • $regex  匹配满足正则表达式的文档
      • {field:{:/pattern/,:'<options>'}}

      • {field:{:/pattern/<options>}},在和$in操作符一起使用时,只能使用该语法

        读取用户姓名以c或者j开头的银行账户文档 ---- 第二种语法
        >db.accounts.find({name:{$in:[/^c/,/^j/]}})
         
        读取用户姓名包含LIE(不区分大小写)的银行账户文档 ---- 第一种文档
        >db.accounts.find({name:{$regex:/LIE/,$options:"i"}})
        
文档游标
  • db.collection.find()返回一个文档集合游标,在不迭代游标的情况下,只列出前20个文档

    注意末尾的分号
    >var myCursor = db.accounts.find();
    myCursor
    
    遍历完游标中所有的文档之后,或者在10分钟之后,游标便会自动关闭,可以使用noCursorTimeout()函数来保持游标一直有效
    >var myCursor = db.accounts.find().noCursorTimeout();
    
    在这之后,在不遍历游标的情况下,需要主动关闭游标;游标遍历完也会关闭
    >myCursor.close()
    
  • 游标函数

    • cursor.hasNext()

    • cursor.next()

      >var myCursor = db.accounts.find({name:"george"});
      while( myCursor.hasNext()) {
      	printjson(myCursor.Next());
      }
      
    • cursor.forEach()

      >var myCursor = db.accounts.find({name:"george"});
      myCursor.forEach(printjson)
      
    • cursor.limit()

    • cursor.skip()

    • cursor.count()

      • cursor.count(<applySkipLimit>),默认情况下参数为false,即忽略limit和skip的效果
    • cursor.sort(),注意这里sort的优先级高于skip高于limit

      • cursor.sort(<document>),这里的<document>定义了排序的要求,{field:ordering},1表示正向排序,-1表示逆向排序
文档投影
  • db.collection.find(<query>,<projection>),不使用投影时,db.collection.find()返回符合筛选条件的完整文档,而使用投影可以有选择性的返回文档中的部分字段
    • {filed:inclusion},1表示返回字段,0表示不返回字段,默认会返回文档主键_id,可以使用_id:0不返回文档主键
    • 除文档主键之外,我们不可以在投影文档中混用包含和不包含操作,即要么列出所有想要包含的字段,要么列出所有不想包含的字段
  • 在数组字段上使用投影
    • $slice操作符可以返回数组字段中的部分元素

      • $slice的参数为n时,表示投射数组中前n个元素
      • $slice的参数为-n时,表示投射数组中倒数n个元素
      • $slice的参数为[n,m]时,表示数组进行skip(1)和limit(m)操作
    • $elemMatch$操作符可以返回数组字段中满足筛选条件的第一个元素,当对文档的筛选条件和在投射操作中对数组的筛选条件一致的时候,可以使用$操作符

      使用$elemMatch操作符
      >db.accounts.find({},{_id:0,name:1,contact:{$elemMatch:{$gt:"Alabama"}}})
      
      使用$操作符,这里不建议使用$操作符
      >db.accounts.find({contact:{$gt:"Alabama"}},{_id:0,name:1,"contact.$":1})
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值