111

果子爸聊技术 2018-01-23 17:44:25 ⋅ 558 阅读

第一部分 前期准备

1.1 插入测试数据

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"}
])

第二部分 Find

2.1 Find查询数据的语法格式如下:

> db.collection.find(query, projection)
1. query[可选]: 主要是一些筛选条件, 文档类型数据;
2. projection[可选]: 返回的限制字段, 文档类型.

2.2 find 筛选全部数据

第一种, 罗列全部数据
> db.test1.find()
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ] }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2a"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
第二种 筛选某一条数据
> db.test1.find({"name": "xiaoming"})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
第三种 指定返回字段

1或true代表显示, 0或false代表不显示

> db.test1.find({"name": "xiaoming"}, {"age": 1, "name": 1})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18 }

第三部分 查询选择器

3.1 比较选择器

[eq: equal, g: greater, l: less, t: than, n: not, in: in]
1. $eq  :    对比值等于指定值
2. $gt  :    ...大于...
3. $gte:       ...大于等于...
4. $lt:     ...大于...
5. $lte:    ...小于等于...
6. $ne  :    对比值 全部不等于 指定值
7. $in:        指定数组包含对比值
8. $nin:       指定数组不包含对比值
3.1.1 $eq

配置键值对[两种写法]

#eq> db.test1.find({"age": {"$eq": 18}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }#省略, 结果一样> db.test1.find({"age": 18})

匹配数组元素

> db.test1.find({"score": {"$eq": 80}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }#省略, 结果一样> db.test1.find({"score": 80})

匹配数组

#无结果, 因为在此是相当于 db.test1.find({"score": {"$eq": [20, 30]}})> db.test1.find({"score": [20, 30]})
> db.test1.find({"score": [20, 40]})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
3.1.2 $gt 除了数字可以比较之外, 不能忽略BJSON其他类型都可以比较

数字

> db.test1.find({"age": {"$gt": 20}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2a"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }

字符串同样可以比较更多参考BSON Types

> db.test1.find({"name": {"$gt": "lisi"}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
3.1.3 $gte
> db.test1.find({"age": {"$gte": 19}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2a"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }
3.1.4. $lt
> db.test1.find({"age": {"$lt": 19}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
3.1.5. $lte
> db.test1.find({"age": {"$lte": 19}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
3.1.6 $ne 不等于指定值
> db.test1.find({"name": {"$ne": "xiaoming"}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2a"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }
3.1.7 $in 符合指定数组内的任一个即满足
> db.test1.find({"score": {"$in": [90, 100]}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
> db.test1.find({"score": {"$in": [89, 100]}})
3.1.8 $nin 指定数据都不属于指定数组的子集
#三条数据全部不存在89 100, 就输出> db.test1.find({"score": {"$nin": [89, 100]}})
{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2a"), "name" : "lisi", "age" : 29, "score" : [ 40, 60 ] }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }

3.2 逻辑选择器

1. $or: 在一个数组上(二个或更多)执行逻辑||, 满足至少一个, 就算是满足2. $and: 逻辑 &&3. $not: 指定字段不匹配操作表达式, 或不存在该字段4. $nor:    $not 与 $or结合体
3.2.1 $or

语法

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
> db.test1.find({"$or": [{"age": 18}, {"name": "zhangsan"}]})#满足{"name": "zhangsan"}, 输出{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }#满足{"age": 18}, 输出{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }

$or$in的异同

3.2.2 $and
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
#没有满足的> db.test1.find({"$and": [{"age": 18}, {"name": "zhangsan"}]})#同时满足全部条件: 1.{"age": 18} 2.{"name": "xiaoming"}> db.test1.find({"$and": [{"age": 18}, {"name": "xiaoming"}]})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
3.2.3 $not
{ field: { $not: { <operator-expression> } } }

执行$not

> db.test1.find({"age": {"$not":{"$gt": 19}}})

{ "_id" : ObjectId("58c8dc54ef9b994487420f29"), "name" : "zhangsan", "age" : 19, "score" : [ 90, 80 ], "qty" : 10 }
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
{ "_id" : ObjectId("58c9e4b80c4d4cf6f4563b26"), "name" : "xiaohong" }

{"age": {"$not":{"$gt": 19}}}筛选的数据:

1. 小于等于19;
2. 不存在age字段
3.2.4. $nor
{ $nor: [ { <expression1> }, { <expression2> }, ...  { <expressionN> } ] }

备选数据

> db.test1.find().pretty()
{    "_id" : ObjectId("58c8dc54ef9b994487420f29"),    "name" : "zhangsan",    "age" : 19,    "score" : [
        90,
        80
    ],    "qty" : 10
}
{    "_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" }

执行$nor

> db.test1.find({"$nor": [{"age": {"$gt": 20}}, {"qty": 10}]})
{ "_id" : ObjectId("58c8dc54ef9b994487420f2b"), "name" : "xiaoming", "age" : 18, "score" : [ 20, 40 ] }
{ "_id" : ObjectId("58c9e4b80c4d4cf6f4563b26"), "name" : "xiaohong" }

分解上述执行过程

1. age小于等于20, qty不等于10;
2. age小于等于20, qty字段不存在;
3. age字段不存在, qty不等于10;
4. age字段不存在, qty字段不存在;
Tip
1. db.collection.count(): 集合内对象个数;
2. db.collection.dataSize(): 集合所占大小;




全部评论: 0

    我有话说:

    精品推荐:11个高人气Javascript动画库

    翻译 | 小生 来源 | https://www.zcfy.cc/article/11-javascript-animation-libraries-for-2018

    JDK11即将来临,新特性了解一下

    预计 JDK 11 将于 9 月 25 日正式发布,可用于正常使用。

    Oracle Solaris 11.4 SRU30 发布,Unix 操作系统

    Oracle 上周发布了 Solaris 11.4 SRU30,这是一个稳定版更新,对许多软件包和组件进行了升级,包括 Python 3.9, Perl 5.32, GNU Debugger 10

    httpclient v1.2.11 已经发布

    httpclient v1.2.11 已经发布。本项目针对http协议定义了所有http实现之上的接口来描述一个http请求,使用者只需要面对同一套语义化的接口, 如果需要切换http的

    Redis 5.0.11、6.0.11、6.2 发布,修复 32 位系统上的整数溢出

    Redis 同时发布了 5.0.11、6.0.11 和 6.2 版本。对于使用 32 位 Redis 的用户来说,此次更新解决了一个重要的安全问题,即 32 位系统上的整数溢出((CVE-2021

    Angular 11.0.0-rc.2 发布,Web 前端框架

    Angular 11.0.0-rc.2 现已发布,具体更新内容如下: Bug 修复 common:从r-> Y更改 week-numbering year 格式 compiler

    Angular 11.1.0-next.2 发布,Web 前端框架

    Angular 11.1.0-next.2 现已发布,具体更新内容如下: Bug 修复 animations:在浏览器动画生成器中实现 getPosition compiler-cli

    Angular 11.1.0 正式发布,支持 TypeScript 4.1

    。 近日,Angular 11.1.0 正式发布...

    Elasticsearch 7.11.2 发布,提升缓存效率

    Elasticsearch 7.11.2 正式发布,此次更新内容如下: 增强 提高碎片级请求缓存效率 #69505 Bug 修复 聚合 修正用 doc_count 执行过滤器的过滤器

    InfluxDB 1.7.11 发布,开源时序数据库

    InfluxDB 1.7.11 现已发布,具体更新内容如下: Bug 修复 #17633:fix(storage/reads):更新 sortKey 排序方法以使用空字节作为分隔符,而不是逗号

    FreeFileSync 11.3 发布,文件夹比较与同步软件

    FreeFileSync 11.3 已发布。这是一个文件夹比较和同步软件,可以创建和管理所有重要文件的备份副本。FreeFileSync 不是每次都复制每个文件,而是确定源文件夹与目标文件夹之间的

    Deepin 深度系统更新(2020.11.25)发布

    深度系统官方发布了深度系统更新(2020.11.25),本次更新部分深度应用,全面优化使用体验,包括磁盘管理器、文件管理器、深度音乐、深度影院、深度相机等。修复部分模块漏洞,提升系统安全性。其他主要

    FreeFileSync 11.4 发布,文件夹比较与同步软件

    FreeFileSync 11.4 已发布。这是一个文件夹比较和同步软件,可以创建和管理所有重要文件的备份副本.FreeFileSync 不是每次都复制每个文件,而是确定源文件夹与目标文件夹之间的

    FreeFileSync 11.5 发布,文件夹比较与同步软件

    FreeFileSync 11.5 已发布。这是一个文件夹比较和同步软件,可以创建和管理所有重要文件的备份副本.FreeFileSync 不是每次都复制每个文件,而是确定源文件夹与目标文件夹之间的

    Apache IoTDB 0.11.2 发布,物联网时序数据库

    Apache IoTDB 0.11.2 现已发布。Apache IoTDB 是一个集成数据专为时间序列数据设计的管理引擎。它为用户提供以下服务:数据收集、存储和分析。由于其轻巧的结构,高

    前端框架 Angular 11.0.0 正式发布,不再支持 IE 9 、10

    前端框架 Angular 11.0.0 正式发布。 Angular 11.0.0 将 TypeScript 升级到 4.0, 对 TypeScript 3.9 不再支持。 放弃了对 IE 9 、10