mongoose使用之查询篇 NODE

shuke 2019-3-17 2157

1、查询方法

mongoose查询使用最基础的方法就是find、findOne方法,前者查询所有满足条件的值,后者取满足条件的某一个值。

2、查询条件

mongoose查询条件其实就是在find方法的基础上添加mongodb条件操作符,如Thing.find().gt('age', 21)就等同于Thing.find({age: {$gt: 21}}),mongodb条件操作符如下:

$or 或关系

$nor 或关系取反

$gt 大于

$gte 大于等于

$lt 小于

$lte 小于等于

$ne不等于

$in 在多个值范围内

$nin 不在多个值范围内

$all 匹配数组中多个值

$regex 正则,用于模糊查询

$size 匹配数组大小

$maxDistance 范围查询,距离(基于LBS)

$mod 取模运算

$near 邻域查询,查询附近的位置(基于LBS)

$exists 字段是否存在

$elemMatch 匹配内数组内的元素

$within 范围查询(基于LBS)

$box 范围查询,矩形范围(基于LBS)

$center 范围醒询,圆形范围(基于LBS)

$centerSphere 范围查询,球形范围(基于LBS)

$slice 查询字段集合中的元素(比如从第几个之后,第N到第M个元素)

3、填充对象

查询对象时,对象中存在其他对象的引用,查询出来的引用对象默认是显示引用对象的id,如果需要引用对象的其他属性就需要使用populate方法填充引用对象。

使用MOGOOSE来完成一个数据的数组匹配:

var arr=['fxeuwws4879448','hmhafis0021952']
newsmodel.find({"docID":{$in:arr}},function (err, res) {
    if(err)throw err
    console.log(res)
})


最新回复 (1)
全部楼主
  • shuke 2019-3-17
    2

    MongoDB高级查询语句

    MongoDB支持的查询语言非常强大,语法规则类似于面向对象的查询语言,可以实现类似关系数据库单表查询的绝大部分功能,并且由于MongoDB可以支持复杂的数据结构,不受二维表形式的限制,因此MongoDB的查询速度非常快。下面介绍一些MongoDB的高级查询语法。

    1、条件操作符查询

    所谓条件操作符,就是< 、<=、>、>=这些符号,相应的查询语法如下:

    db.collection.find({"key":{$gt:value}});  //大于  key>value
    db.collection.find({"key":{$gte:value}});  //大于等于  key>=value
    db.collection.find({"key":{$lt:value}});  //小于  key<value
    db.collection.find({"key":{$lte:value}});  //小于等于  key<=value

    2、$all匹配所有的值

    这个操作与SQL语法的in类似,但是in只需要满足范围之一的值就可以,但是$all必须满足所有的值。例如

    db.collection.find({age:{$all:[20,21]}});

    可以查询出来 {age:[20,21,22]} 但是查询不出来 {age:[20,22,23]},即一定要有20和21.

    3、$in查询包含的值

    这个与all不一样,查询的值在in给出的范围之内就都可以查出来。例如

    db.collection.find({age:{$in:[20,21]}});

    可以查询出来 {age:[20,21,22]} 和 {age:[20,22,23]} 以及 {age:[21,22,23]},即只需要有20或者21其中之一的都可以。

    4、$exists判断字段是否存在

    可以用$exists判断某一字段是否存在,例如查询存在age字段的记录

    db.collection.find({age:{$exists:true}});

    查询不存在age字段的记录

    db.collection.find({age:{$exists:false}});

    5、null值的处理

    null值处理需要注意的是,不仅仅可以查询出来某一字段值为null的记录,还可以查出来不存在某一字段的记录。例如

    db.collection.find({age:null})

    可以查询出来age为null的记录,以及没有age字段的记录。如果我们需要只去查询存在age字段并且age字段的值为null的记录,需要配合exists操作,例如

    db.collection.find({age:{"$in":[null],"$exists":true}});

    即查询存在age字段的并且age字段值为null的记录

    6、$mod取模运算

    这个操作可以进行模运算。例如,查询age取模5等于3的记录

    db.collection.find({age:{$mod:[5,3]}});

    7、$ne不等于操作

    可以查询不等于某一字段的数据,例如,查询age不等于20的记录

    db.collection.find({age:{$ne:20}});

    8、$nin不包含操作

    这个与$in相反,查询不包含某一字段的记录,例如查询age不等于20,21,22的记录

    db.collection.find({age:{$nin:[20,21,22]}});

    9、count查询记录条数

    这个可以用来知道查询到记录的条数,例如查询age等于20的记录数目

    db.collection.find({age:20}).count();

    10、排序

    用sort函数排序,例如按照age升序排列

    db.collection.find().sort({age:1})

    类似asc,

    按照age降序排列

    db.collection.find().sort({age:-1})

    类似desc。同时也可以在find里面添加查询条件。

    11、skip和limit语句

    这个是用来跳过几条记录然后查询指定数目的记录,例如跳过3条记录查询其余记录的最前面5条,

    db.collection.find().skip(3).limit(5);

    find里面可以加条件,这个类似SQL:select * from collection limit(3,5)

    12、JavaScript查询和$where查询

    例如,查询age大于20的记录,可以分别用到如下的方式:

    db.collection.find({age:{$gt:20}});

    这是条件操作符方式,

    db.collection.find({$where:"this.age > 3"});

    这是$where方式

    db.collection.find("this.age > 3");

    这是内部对象查询

    func=function(){return this.age > 3;} db.collection.find(func)

    这是JavaScript方式。这几种方式都是一样的效果。

    13,存储过程

    MongoDB也可以有存储过程。例如一个简单的SQL存储过程函数为

    function addNum(x,y){
    return x+y;}

    现在要将这个函数转化成MongoDB的存储过程。Mongo的存储过程是保存在db.system.js表中的,可以这么写

    db.system.js.save({_id:"addNum",value:function(x,y){return x+y;}});

    这样就创建了一个存储过程。我们可以对存储过程进行查看、修改和删除操作,例如查看所有的存储过程,

    db.system.js.find()

    ,其余修改和删除类似对记录的操作。

    调用创建好的存储过程,需要用到db.eval(),例如调用刚刚创建的addNum,是这样

    db.eval("addNum(30,12)");

    就可以得出答案是42。

    同时,可以直接使用db.eval来创建存储过程并且直接调用,例如

    db.eval(function(){return 30+12;});

    可以直接得出42,这样可以知道使用db.eval可以直接进行算数运算,非常方便。

    还有就是,存储过程可以处理数据库内部的操作,例如

    db.system.js.save({_id:"getCount",value:function()
    {return db.collection.find({age:20}).count();}});

    可以将db.collection中age为20的记录数目保存在getCount这个存储过程中,调用的时候这样

    db.eval("getCount()");

    就可以直接取得那个数目。 

    14,数组查询 

    “$size”用来查询数组的长度.例如查找fav长度为2的文档:

    db.test3.find({"fav":{"$size":2}})
    { "_id" : ObjectId("573e8b719e178b5475b29d91"), "name" : "tom", "fav" : [ "chess", "cooking" ] }

    “size”不能与其它的查询条件组合使用,例如”slice操作符

    find的第二个参数返回指定的键.这个特别的”$slice”操作符可以返回某个键匹配的数组元素的一个子集. 

    例如我想返回前2个fav的值:

    db.test3.findOne({"name":"brent"},{"fav":{"$slice":2}})
    {
        "_id" : ObjectId("573e874c9e178b5475b29d8e"),
        "name" : "brent",
        "fav" : [
            "game",
            "film"
        ]

    如果想要返回后2个的值,就写-2就可以了. 

    “$slice”也可以指定偏移量和返回的元素数量,例如:

    > db.test3.findOne({"name":"brent"},{"fav":{"$slice":[1,2]}})
    {
        "_id" : ObjectId("573e874c9e178b5475b29d8e"),
        "name" : "brent",
        "fav" : [
            "film",
            "read"
        ]
    }

    这表示跳过前面1个,从第二个开始返回两个元素,如果元素不够则返回所有的元素. 

    除非特别声明,否则使用”$slice”将返回文档中的全部键. 

    返回一个匹配的数组元素

    如果知道元素的下标,那么”slice"非常有用,如果想返回与查询条件相匹配的任意数组元素,使用操作符 . 

    例如下面得到name为bob的,并且显示任意一个评论:

    db.test4.findOne()
    {
        "_id" : ObjectId("573f390c9e178b5475b29d92"),
        "name" : "brent",
        "comment" : [
            {
                "name" : "bob",
                "content" : "good"
            },
            {
                "name" : "jack",
                "content" : "repost"
            }
        ]
    }
     db.test4.find({"comment.name":"bob"},{"comment.$":1})
    { "_id" : ObjectId("573f390c9e178b5475b29d92"), 
    "comment" : [ { "name" : "bob", "content" : "good" } ] }


返回