MongoDB 读取文档

来源:互联网 发布:网络男歌手的伤感歌曲 编辑:程序博客网 时间:2024/06/05 14:32
空的查询文档将匹配集合的全部内容:
    db.test.find({})
可以向查询文档中添加多个键值对,将多个查询条件组合在一起:
    db.users.find(        {"age": 20, "gender": "male"}    )

指定需要返回的键

    可以通过find(或者findOne)的第二个参数来指定想要返回的键:
    db.test.find(        {},        {"url": 1, "pageviews": 1, "_id": 0} // 默认情况下"_id"键总是被返回    )

查询条件

    "$lt", "$lte", "$gt", "$gte"就是全部的比较操作符,分别对应<, <=, >, >=。可以将其组合起来以便查找一个范围的值。
    查找年龄在[20, 30]范围内的用户:
    db.users.find(        {"age": {"$gte": 20, "lte": 30}}    )
    对于文档的键值不等于某个特定值的情况,需要使用条件操作符"$ne",它表示!=

OR查询

    MongoDB有两种方式进行OR查询:"$in"可以用来查询一个键的多个值,"$or"可以在多个键中查询任意的给定值
    "$in"非常灵活,可以指定不同类型的键和值
    db.users.find(        {"user_id": {"$in": [12345, "joe"]}}    )
    要是"$in"对应的数组只有一个值,那和直接匹配这个值效果一样
   db.users.find(        {"user_id": {"$in": ["joe"]}} // == {"user_id": "joe"}    )
    "$or"接受一个包含所有可能条件的数组作为参数,OR型查询第一个条件应该尽可能多的匹配更多的文档,这样才最高效
    db.raffle.find(        {"$or": [            {"ticket_no": {"$in": [451, 623, 985]}},            {"winner": true}        ]}    )

$not

    "$not"操作是元条件句,即可以用在任何其他条件之上。拿取模运算"$mod"来说,"$mod"会将查询的值除以第一个给定值,若余数等于第二个给定值则匹配成功
    假设有id范围为[1,12]的用户,返回不等于能被5整除余1的用户id:
    db.users.find(        {"id_number": {"$not": {"$mod": [5, 1]}}}    )

条件语义

    基本情况下,条件语句是内层文档的键,而修改器则是外层文档的键。有一些元操也位于外层文档中,比如"$and", "$or", "nor"。

    一个键可以有任何多个条件,但是一个键不能对应多个更新修改器。

特定类型的查询

null

    null不仅会匹配某个键的值为null的文档,而且还会匹配不包含这个键的文档
    返回仅仅匹配键值为null的文档:
  db.test.find(        {"url": {"$in": [null], "$exists": true}}    )

正则表达式

    正则表达式能灵活有效地匹配字符串。系统可以接受正则表达式标志(i),但并不是一定要有。正则表达式也可以匹配到自身,虽然几乎没有人直接将正则表达式插入到数据库中。
    db.test.insert({"bar": /foo/})    db.test.find({"bar": /foo/})
    MongoDB可以为前缀型正则表达式(比如: /^zhang/)查询创建索引,所以这种类型的查询会非常高效

查询数组

    db.food.insert({"fruit": ["apple", "banana", "peach"]})  查询:db.food.find({"fruit": "banana"})会成功匹配到该文档
    $all: 通过多个元素来匹配数组
        找到既有apple又有banana的文档:
        db.food.find(            {"fruit": {"$all": ["apple", "banana"]}}        )
        也可以使用整个数组进行精确匹配,但是,精确匹配对于缺少元素或者元素冗余的情况失灵
            例如下面查询就不能找到上面新插入的文档
            db.food.find({"fruit": ["apple", "banana"]})
        查询数组特定位置的元素,可以使用key.index语法指定下标
            db.food.find({"fruit.2": "peach"})
     $slice:前面提及,find的第二个参数是可选的,可以指定需要返回的键。而$slice操作符可以返回某个键匹配的数组元素的一个子集,使用$slice将返回文档中的所有键,即便你并没有显示地出现在键的说明符中
        返回某篇博客评论的前10条:
        db.blog.findOne(            criteria,            {"comments": {"$slice": 10}}        )
        $slice也可以指定偏移值以及希望返回的元素数量,来返回元素集合中间位置的某些结果
        返回某篇博客评论的24~33个元素:
        db.blog.findOne(            criteria,            {"comments": {"$slice": [23, 10]}} //[偏移量(从24开始), 总个数]        )
   返回一个匹配的数组元素
        返回所有博客下zhangsan的第一条评论:
        db.blog.find(            {"comments.name": "zhangsan"},             {"comments.$": 1}        )
    数组和范围查询的相互作用
        先看一个示例(假设有如下所示的文档):
            {"x": 5}
            {"x": 15}
            {"x": 25}
            {"x": [5, 25]}
        如果希望找到"x"键的值位于10和20之间的所有文档,直接想到的查询方式:db.test.find({"x": {"gt": 10, "$lt":20}}),希望返回的文档是{"x": 15},但是实际上它返回了两个文档:{"x": 15}和{"x": [5, 25]}, why?因为25与查询条件中的第一条语句(大于10)相匹配,5与查询条件中的第二个语句(小于20)相匹配。

        解决这种问题的方法:
            预期返回:{"x": 15}
            使用方法:db.test.find({"x": {"$gt": 10, "$lt": 20}}).min({"x": 10}).max({"x": 20})
            使用条件:需在当前查询字段创建过索引,但是在索引范围内对数组使用"gt"/"lt"查询,效率非常低。

            预期返回:{"x": [5, 25]}
            使用方法:db.test.find({"x": {"$elemMatch": {"$gt": 10, "$lt": 20}}})
            温馨贴士:"elemMatch"要求MongoDB同时使用查询条件中的两个语句与一个数组元素进行比较,而且,"elemMatch"不会匹配非数组元素
    查询内嵌文档
        查询整个文档(精确匹配,如果文档中name键下新增字段,则匹配失败,而且这种查询还是与顺序相关的)
       db.users.find(            {"name": {"first": "joe", "last": "schmoe"}}       )
        只针对键/值对进行查询(对于文档中包含"."的键[例如:URL],点表示法会有局限性,一种解决办法是在插入前或者提取后执行一个全局替换,将"."替换成一个URL中非法字符)
    
       db.users.find(            {"name.first": "joe", "name.last": "schmoe"}       )
        $elemMatch:在查询条件中部分指定匹配数组中的单个内嵌文档。$elemMatch将限定条件进行分组,仅当需要对一个内嵌文档的多个键进行操作时才会用到
                 查询joe发表5分好评的博客:
        db.blog.find(            {"comments": {"$elemMatch": {                "author": "joe",                "score": {"$gte": 5}            }}}        )


0 0
原创粉丝点击