您的位置:首页 > 数据库 > Mongodb

MongoDB 读取文档

2015-08-13 16:05 429 查看
空的查询文档将匹配集合的全部内容:

    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}
}}}
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: