MongoDB查询常用语句

Find方法的使用

find(参数1,参数2)
参数1:需要返回的文档
参数2:指定想要的键

//查询users表中age为27的文档
db.users.find({'age' : 27})
//查询users表中username为joe的文档
db.users.find({'username':'joe'})
//可以使用多条件查询,会解释成条件1 AND 条件2 AND...AND 条件N
//例如查询username为joe且age为27的用户
db.users.find({'username' : 'joe', 'age': 27})
  • 指定返回的键,find()方法的第二个参数就是指定返回的键
    //提取users表中的username和email键,默认会返回_id键,所以我们在第二个参数中将其设置为0,就不会提取了。
    db.users.find({},{'username' : 1, 'email' : 1, '_id' : 0})

查询条件

替代符 $lt $lte $gt $gte $ne
对应关系 < <= > >= !=
//查询年龄在18~30(含)之间的用户
db.users.find({'age' : {$gte : 18, $lte : 30}})
//查询不是joe的用户
db.users.find({'username': {$ne : 'joe'}})

OR查询

$in可以用来查询一个键的多个值
$or用来完成多个键值的任意给定值

//对于单一键要是有多个值与其匹配的话,就要使用$in加一个条件数组
//例如中奖号码为725,542和390
db.raffle.find({'ticket_no' : { $in : [] }})
//与$in相对应的方法是$nin
db.raffle.find({'ticket_no' : { $nin : [725, 542, 390] }})

//$or的使用
db.raffle.find({'$or' : [{'ticket_no' :725},{'winner' : true}]})

//两者结合使用  db.raffle.find({'$or' : [{'ticket_no' :{ $in : [725, 542, 390]}},{'winner' : true}]})

$not是元条件句,可以在任何其他条件之上

//$mod为取模运算符,$mod会将查询的值除以第一个给定的值,若余数等于第二个给定值则会返回该结果
db.users.find({'id_num' : {$mod : [5, 1]}})
//上面会返回id_num为1,6,11,16....
//但是想要放回2,3,4,5,7,8...就要使用$not了
db.users.find({'id_num' : {$not : {$mod : [5, 1]}}})

特定类型查询

正则表达式

//例如查询Joe或joe或者JOe
db.users.find({'username' : /joe/i})

查询数组中的元素

//首先建立food表,并插入一个文档
db.food.insert({'fruit':['apple', 'banana', 'peach']})
//下面的查询会返回该文档
db.food.find({'fruit' : 'banana'})
  • $all
    如果需要多个元素来匹配数组,就需要使用$all了

    //假设在我们表中3个下面的文档
    db.food.insert({'_id' : 1,'fruit' : ['apple', 'banana', 'peach']})
    db.food.insert({'_id' : 2,'fruit' : ['apple', 'kumquat', 'orange']})
    db.food.insert({'_id' : 3,'fruit' : ['cherry', 'banana', 'apple']})
    
    //要找到既有apple又有banana的文档,就要用到$all了
    db.food.find({'fruit' : {$all : ['apple', 'banana']}})
    
    //如果需要查询指定位置的元素,就需要使用key.index语法指定下标了
    db.food.find({'fruit.2' : 'peach'})
    //数组下标都是从0开始的,所以它会匹配到_id为1的文档




  • $size
    对于查询数组来说意义非凡,可以用其来查询指定长度的数组。

    //指定需要查询数组的长度
    db.food.find({'fruit' : {$size : 3}})
    
    //如果需要一个长度范围,需要一些技巧
    //因为$siez查询不支持$gt,$gte等条件语句
    //但是我们可以给每个文档增加一个size键,这样就可以方便我们查询了
    db.food.insert({'_id' : 1,'fruit' : ['apple', 'banana', 'peach'],'size' : 3})
    
    //当我们需要添加水果时
    db.food.update({'_id' : 1},{$push : {'fruit' : 'strawberry',$inc:{'size' : 1}}})
    
    //之后我们就可以使用下面这样子的查询了
    db.food.find({'size' : {$gt : 3}})




  • $slice操作符
    $slice返回数组的一个子集合

    //返回一个博客文档的前10条评论
    db.posts.findOne({'_id' : 1}, {'comments' : {$slice : 10}})
    
    //返回一个博客文档的后10条评论
    db.posts.findOne({'_id' : 1}, {'comments' : {$slice : -10}})
    
    //也接受便宜值和要返回的数量
    //返回一个博客文档的从第24条评论开始的10条评论
    db.posts.findOne({'_id' : 1}, {'comments' : {$slice : [23, 10]}})

查询内嵌文档

可以查询整个文档或者针对键值进行查询

//假如有以下文档
{
  'name' : {
    'first' : 'Joe',
    'last'  : 'Schmoe'
  }
  'age'  : 45
}

//要查询姓名是Joe Schmoe的人可以这样
db.users.find({'name.fisrt':'Joe','name.last':'Schmoe'})


$where的使用

//假设我们的表food有两个文档如下
/* 0 */
{
    "_id" : ObjectId("52dd1effaad1ad6d22d62a33"),
    "apple" : 4,
    "banana" : 4
}

/* 1 */
{
    "_id" : ObjectId("52dd2157aad1ad6d22d62a34"),
    "apple" : 5,
    "banana" : 6
}

//我们要查询其中的apple和banana相等的文档
//函数中的this代表着将要返回的文档
db.food.find({
    $where : function () {
       if(this.apple && this.banana && this.apple == this.banana)
       {
           return true
        } else {
           return false
    }}})

这样子查询性能不高,一般不建议使用,但是如果确实是没有好的方法也可以使用,查询的结果非常直观!



你可能感兴趣的:(MongoDB查询常用语句)