MongoDB 查询文档(六)

禅あ思 2018-03-05 14:51:32 ⋅ 676 阅读

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

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实战联盟”哦~~~




全部评论: 0

    我有话说:

    MongoDB 查询文档(五)

    第一部分 前期准备1.1 插入测试数据db.test1.insertMany

    MongoDB 更新/删除文档(四)

    第一部分 更新文档 文档存入数据库之后,就可以采用Update来修改它的内容, db.collection.update( #查询条件   <query>, #修改器

    MongoDB系列---数据类型/插入文档(三)

    第一部分 BJSON 与 JSON MongoDB文档与JavaScript中的对象很相似,JavaScript中的数据交互格式是JSON格式. JSON的数据格式: 1. null;2. 布尔

    MongoDB 更新/删除文档(四)

    更新文档文档存入数据库之后,就可以采用Update来修改它的内容,db.collection.up

    MongoDB实战篇:高级查询----$elemMatch与aggregate

    基本的Find查询将在其他章节示例,本文主要针对于遇到的问题与解决的方法做个记录,希望可以减少遇到这类问题的

    MongoDB系列之----概述(一)

    MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

    MongoDB 数据库的基本操作(二)

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

    MongoDB更新(五)

    如果数据库中尚未有数据, 准备测试数据db.test1.insertMany([    {"name": "zhangsan", "age": 19, "score": [90, 80]},    {"na...

    MongoHelper 0.2.5 发布,Spring-Data-MongoDB 增强工具包

    工具包简化 CRUD 操作,并且提供了类 jpa 的数据库操作。

    MongoDB实战篇:数据库备份与恢复/导出与导入

    mongodump命令可以通过参数指定导出的数据量级转存的服务器......

    MongoDB 4.4.5 发布

    MongoDB 是一种面向文档的数据库管理系统,用 C++ 等语言撰写而成,以解决应用程序开发社区中的大量现实问题。MongoDBMongoDB Inc. 于 2007 年 10 月开发

    Syncthing 1.11.0 和 1.11.1 发布,连续文件同步工具

    Syncthing 是一个免费开源的工具,它能在你的各个网络计算机间同步文件/文件夹,它的同步数据是直接从一个系统中直接传输到另一个系统的,并且它是安全且私密的。 Syncthing 1

    Mongoose 5.12.5 发布,MongoDB 异步对象模型工具

    Mongoose 是设计用于异步环境的 MongoDB 对象模型工具。Mongoose 支持 promises 和 callbacks。Mongoose 5.12.5 正式发布,本次更新内容如下

    「开源资讯」Atom 1.52.0 和1.53.0-beta0发布,跨平台文本编辑器

    Atom 同时发布了 1.52.0 和 1.53.0-beta0 版本。Atom 是 GitHub 专门为程序员推出的一个跨平台文本编辑器。具有简洁和直观的图形用户界面,并有很多有趣的特点:支持

    关于MySQL 通用查询日志和慢查询日志分析

    MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。

    专业解决 MySQL 查询速度慢与性能差

    什么影响了数据库查询速度?关于数据库性能并不是DBA才关心的事。

    Node模块之fs模块()

    屏幕快照 2017-08-08 上午10.53.21.png 第一部分 概述 Node.js 提供一组类似UNIX(POSIX)标准的文件操作API,Node.js中操作文件的模块是fs(File

    「性能与架构」MySQL 8 查询优化新工具 Explain Analyze

    Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索。