美文网首页
MongoDB 查询文档(七)

MongoDB 查询文档(七)

作者: simuty | 来源:发表于2017-03-22 20:45 被阅读298次

由于篇幅过长, 分为二篇, 接上篇MongoDB 查询文档(六)

目录

目录

如果数据库中尚未有数据, 准备测试数据

db.test1.insertMany([
    {"name": "zhangsan", "age": 19, "score": [90, 80]},
    {"name": "lisi", "age": 29, "score": [40, 60]},
    {"name": "xiaoming", "age": 18, "score": [20, 40]},
    {"name": "xiaohong"}
])

第一部分 元素操作符

1. $exists: 判断指定字段是否存在,并返回相应的结果
2. $type: 匹配字段对应的类型
1.1 $exists
{ field: { $exists: <boolean> } }

判断指定字段是否存在,并返回相应的结果, 直接上代码
{"$exists": true}

> db.test1.find({"qty": {"$exists": true}})
#张三存在qty属性, 就返回该条数据
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }

{"$exists": false}

> db.test1.find({"qty": {"$exists": false}})
#以下三条数据均不存在qty字段
{ "_id" : ObjectId("58c8dc54ef9b994487420f2a"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
{ "_id" : ObjectId("58c9e4b80c4d4cf6f4563b26"), "name" : "xiaohong" }
1.2 $type

$type文档

{ field: { $type: <BSON type number> | <String alias> } }

第二部分

1. $mod 模运算
2. $regex   正则表达
3. $text    文本搜索
4. $where: 支持js表达式
2.1 $mod运算
db.users.find('this.age % 6 == 0'); 
或者 
> db.users.find({"age" : {$mod : [6, 0]}});
{ "_id" : ObjectId("58d21667edca14f0f7ffbedb"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
2.2 $regex 正则表达

匹配正则表达式
注: 之后后专门整理一篇正则表达式的文章

2.3 $text

全文本搜索

2.4 where

第三部分

1. $all: 匹配数组中包含query中的元素
2. $elemMatch   : 筛选数组中的元素
3. $size: 匹配数组中元素的个数.
3.1 $all
{ <field>: { $all: [ <value1> , <value2> ... ] } }

官方实例

{ tags: { $all: [ "ssl" , "security" ] } }
等价于
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }

为了便于理解, 在此修改一下测试数据, 将小明的成绩改为三个数字

> db.users.update({"name": "xiaoming"}, {"$push": {"score": 100}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

此时两种成功的筛选数据的方式, 得到结果

#测试数据在最上边,必须同时满足score包含备选数据, [子集与真子集]
> db.users.find({"score": {"$all": [20, 40]}})
{ "_id" : ObjectId("58d21667edca14f0f7ffbedb"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40, 100 ] }
> db.users.find({"score": {"$all": [20, 40, 100]}})
{ "_id" : ObjectId("58d21667edca14f0f7ffbedb"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40, 100 ] }

无结果数据

#没有任何一条数据的score**同时**包含20 60
> db.users.find({"score": {"$all": [20, 60]}})
> 
总结 X$in 与 $all的区别

用实例告诉大家的区别

x.1 $in 原始数据中只要包含一条或多条备选数据, 即满足
> db.users.find({"score": {"$in": [20, 60]}})
{ "_id" : ObjectId("58d21667edca14f0f7ffbeda"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }
{ "_id" : ObjectId("58d21667edca14f0f7ffbedb"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40, 100 ] }
x.2 $all 原始数据必须完整的包含或等于被选数据
#为空
> db.users.find({"score": {"$all": [20, 60]}})
> 
3.2 $elemMatch

语法

{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }

实例一

筛选数组中包含 大于50小于100的数据, 只要属于其子集即可

> db.users.find({"score": {"$elemMatch": {"$gt": 50, "$lt": 100}}})
{ "_id" : ObjectId("58d21667edca14f0f7ffbed9"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ] }
{ "_id" : ObjectId("58d21667edca14f0f7ffbeda"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }

实例二

插入测试数据

db.test1.insert([
{ "id": 1, "results": [ { "product": "abc", "score": 10 }, { "product": "xyz", "score": 5 } ] },
{ "id": 2, "results": [ { "product": "abc", "score": 8 }, { "product": "xyz", "score": 7 } ] },
{ "id": 3, "results": [ { "product": "abc", "score": 7 }, { "product": "xyz", "score": 8 } ] }
])

定位其中的一条

> db.test1.find({"results": {"$elemMatch": {"product": "abc", "score": {"$gt": 8}}}})
{ "_id" : ObjectId("58d26383fc8d60106f1885bc"), "id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }
> 

更多关于update与$elemMatch操作
3.3 $size: 匹配数组中元素的个数.

筛选score拥有三个子集的数据

> db.users.find({"score": {"$size": 3}})

{ "_id" : ObjectId("58d21667edca14f0f7ffbedb"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40, 100 ] }

第四部分 基本操作符

插入测试数据

> for(var i = 0; i < 100; i++){
    db.test2.insert({"age": i})
}
WriteResult({ "nInserted" : 1 })

> db.test2.find().count()
100
4.1 Skip()

语法

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

官方实例

function printStudents(pageNumber, nPerPage) {
   print("Page: " + pageNumber);
   db.students.find().skip(pageNumber > 0 ? ((pageNumber-1)*nPerPage) : 0).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } );
}

> db.test2.find().skip(95)
{ "_id" : ObjectId("58d26dc1b527dc1a130563a8"), "age" : 95 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563a9"), "age" : 96 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563aa"), "age" : 97 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563ab"), "age" : 98 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563ac"), "age" : 99 }

4.2 排序sort()

默认为升序[1], 降序为[-1]

>db.COLLECTION_NAME.find().sort({KEY:1})
>

例子

#默认升序
> db.test2.find().sort({"age": 1})
{ "_id" : ObjectId("58d26dc1b527dc1a13056349"), "age" : 0 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634a"), "age" : 1 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634b"), "age" : 2 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634c"), "age" : 3 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634d"), "age" : 4 }

#降序
> db.test2.find().sort({"age": -1})
{ "_id" : ObjectId("58d26dc1b527dc1a130563ac"), "age" : 99 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563ab"), "age" : 98 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563aa"), "age" : 97 }
{ "_id" : ObjectId("58d26dc1b527dc1a130563a9"), "age" : 96 }

4.2 排序limit()
>db.COLLECTION_NAME.find().limit(NUMBER)
> db.test2.find().limit(5)
{ "_id" : ObjectId("58d26dc1b527dc1a13056349"), "age" : 0 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634a"), "age" : 1 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634b"), "age" : 2 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634c"), "age" : 3 }
{ "_id" : ObjectId("58d26dc1b527dc1a1305634d"), "age" : 4 }
4.3 综上一块来个实例

放在一块说会好些, 要不没有说明性

跳过前10条, 显示接下来的5条, 并按照age升序排列

> db.test2.find().skip(10).sort({"age": 1}).limit(5)
{ "_id" : ObjectId("58d26dc1b527dc1a13056353"), "age" : 10 }
{ "_id" : ObjectId("58d26dc1b527dc1a13056354"), "age" : 11 }
{ "_id" : ObjectId("58d26dc1b527dc1a13056355"), "age" : 12 }
{ "_id" : ObjectId("58d26dc1b527dc1a13056356"), "age" : 13 }
{ "_id" : ObjectId("58d26dc1b527dc1a13056357"), "age" : 14 }

更多精彩内容请关注“IT实战联盟”哦~~~


IT实战联盟.jpg

相关文章

  • MongoDB 查询文档(七)

    由于篇幅过长, 分为二篇, 接上篇MongoDB 查询文档(六) 目录 如果数据库中尚未有数据, 准备测试数据 第...

  • spring date mongo mongotemplate使

    Spring数据MongoDB三:基本文档查询(查询,基本查询)(一) MongoDB高级查询[聚合] sprin...

  • mongo二2018-06-29

    MongoDB基础语法——查询数据 基本查询 find([{文档条件}]):全集合查询 findOne([{文档条...

  • MongoDB - 文档查询

    1.基本查询 查询集合中所有文档 使用游标遍历集合 2.条件查询 2.1 条件查询支持按照指定的字段值精准匹配 2...

  • MongoDB 查询文档

    语法MongoDB 查询数据的语法格式如下: 该语句是查询collection中全部数据,效果和关系型数据库的语句...

  • MongoDB查询文档

    MongoDB 查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所有文档。 db.col...

  • MongoDB查询文档

    1.查询所有文档 语法:db.集合名字.find() 2.根据条件查找匹配的文档 语法:db.集合名字.find(...

  • MongoDB实现地理位置查询

    Mongodb地理位置查询文档MongoDB支持地理位置索引,可以直接用于位置距离计算和查询。查询结果默认将会由近...

  • PHP MongoDB 查询文档 --- 2022-04-02

    本章介绍PHP MongoDB文档查询的用法。 前置教程 MongoDB教程[https://www.tizi36...

  • MongoDB 文档查询 I

    文档查询 语法: pretty() 方法可将结果格式化为可读模式 query 条件 字段比较 AND 条件 格式:...

网友评论

      本文标题:MongoDB 查询文档(七)

      本文链接:https://www.haomeiwen.com/subject/huranttx.html