4.数组的特殊待遇
很多人并不知道这个特性,但数组确实是经过特殊处理的。
1 |
> db.c.insert({ a: [{x: 2}, {x: 3}], _id: "aaa" })
|
2 |
> db.c.find({ 'a.x' : { $gt: 1 }})
|
3 |
< { "_id" : "aaa" , "a" : [ { "x" : 2 }, { "x" : 3 } ] }
|
4 |
> db.c.find({ 'a.x' : { $gt: 2 }})
|
5 |
< { "_id" : "aaa" , "a" : [ { "x" : 2 }, { "x" : 3 } ] }
|
6 |
> db.c.find({ 'a.x' : { $gt: 3 }})
|
因此每当有一个数组对象,选择器都会“分发”给每一个元素,这就像“如果其中一个元素匹配,那么整个文档(document)都会被匹配”。
值得注意的是,它并不适用于嵌套数组::
1 |
> db.x.insert({ _id: "bbb" , b: [ [{x: 0}, {x: -1}], {x: 1} ] })
|
2 |
> db.x.find({ 'b.x' : 1 })
|
3 |
< { "_id" : "bbb" , "b" : [ [ { "x" : 0 }, { "x" : -1 } ], { "x" : 1 } ] }
|
4 |
> db.x.find({ 'b.x' : 0 })
|
6 |
> db.x.find({ 'b.x' : -1 })
|
同样也适用于预测数组中字段(field)的一些特性:
1 |
> db.z.insert({a:[[{b:1,c:2},{b:2,c:4}],{b:3,c:5},[{b:4, c:9}]]}) |
2 |
> db.z.find({}, { 'a.b' : 1})
|
3 |
< { "_id" : ObjectId( "52ca24073e47d3d91146f2b7" ), "a" : [ [ { "b" : 1 }, { "b" : 2 } ], { "b" : 3 }, [ { "b" : 4 } ] ] }
|
如果我们在选择器上将以上特性与使用数字键做更多的组合,那么这个特性将变得越来越难以预测:
01 |
> db.z.insert({a: [[{x: "00" }, {x: "01" }], [{x: "10" }, {x: "11" }]], _id: "zzz" })
|
02 |
> db.z.find({ 'a.x' : '00' })
|
04 |
> db.z.find({ 'a.x' : '01' })
|
06 |
> db.z.find({ 'a.x' : '10' })
|
08 |
> db.z.find({ 'a.x' : '11' })
|
10 |
> db.z.find({ 'a.0.0.x' : '00' })
|
11 |
< { "_id" : "zzz" , "a" : [ [ { "x" : "00" }, { "x" : "01" } ], [ { "x" : "10" }, { "x" : "11" } ] ] }
|
12 |
> db.z.find({ 'a.0.0.x' : '01' })
|
14 |
> db.z.find({ 'a.0.x' : '00' })
|
15 |
< { "_id" : "zzz" , "a" : [ [ { "x" : "00" }, { "x" : "01" } ], [ { "x" : "10" }, { "x" : "11" } ] ] }
|
16 |
> db.z.find({ 'a.0.x' : '01' })
|
17 |
< { "_id" : "zzz" , "a" : [ [ { "x" : "00" }, { "x" : "01" } ], [ { "x" : "10" }, { "x" : "11" } ] ] }
|
18 |
> db.z.find({ 'a.0.x' : '10' })
|
20 |
> db.z.find({ 'a.0.x' : '11' })
|
22 |
> db.z.find({ 'a.1.x' : '00' })
|
24 |
> db.z.find({ 'a.1.x' : '01' })
|
26 |
> db.z.find({ 'a.1.x' : '10' })
|
27 |
< { "_id" : "zzz" , "a" : [ [ { "x" : "00" }, { "x" : "01" } ], [ { "x" : "10" }, { "x" : "11" } ] ] }
|
28 |
> db.z.find({ 'a.1.x' : '11' })
|
29 |
< { "_id" : "zzz" , "a" : [ [ { "x" : "00" }, { "x" : "01" } ], [ { "x" : "10" }, { "x" : "11" } ] ] }
|
好的,我们再来稍作改动。这个和上一个案例的区别仅仅是内部值的改动:在上一个案例中是一个对象,在下面的案例中将会是一个数字。这足以让数组的特性发生改变:
01 |
> db.p.insert({a: [0], _id: "xxx" })
|
03 |
< { "_id" : "xxx" , "a" : [ 0 ] }
|
04 |
> db.q.insert({a: [[0]], _id: "yyy" })
|
07 |
> db.q.find({ 'a.0' : 0})
|
09 |
> db.q.find({ 'a.0.0' : 0})
|
10 |
< { "_id" : "yyy" , "a" : [ [ 0 ] ] }
|
陷阱: 尽可能的避免数组或者嵌套数组以及其他一对多关系的数据存在于文档之中,并且在需要查询的时候,通常我们倾向于按照一对一关系去查询。然而对于使用数字键(例如{ 'a.0.x': Y }意味着字段a的第一个元素的x字段必须为Y)的混合型文档很可能会让人感觉非常别扭,当然这也取决于数据的复杂程度。
|
顶 翻译的不错哦!
|
相关推荐
Thinkphp是一个基于PHP的轻量级框架...这包括了添加或修改查询方法以适应MongoDB的查询语法,以及处理框架内部潜在的bug。这些改动可以帮助Thinkphp在结合MongoDB使用时,为开发者提供更加强大和灵活的数据库查询能力。
5. 脚本支持:MongoChef允许用户编写和执行JavaScript脚本,直接在界面上对数据库进行更复杂的操作。 6. 安全性:用户可以管理数据库的认证和授权,设置用户权限,确保数据库安全。 7. 多平台兼容:MongoChef支持...
此外,可能会有诸如Mongoose之类的库,用于在MongoDB上进行数据操作,提供ORM(对象关系映射)功能,简化数据库操作。前端部分可能使用了React或Vue等库,构建用户界面,这些库能够创建动态、交互性强的组件。 开发...
5. 浏览器兼容性:了解不同浏览器对某些特性的差异,如CSS3新特性、JavaScript ES6+语法等。 6. jQuery与框架:理解jQuery简化DOM操作的优势,以及Vue、React、Angular等主流框架的基本概念和应用场景。 7. 响应式...
RAR格式支持分卷压缩,这意味着大文件可以分割成几个小文件,方便在有限的存储介质上分批传输。 2. **解压工具**:要访问"实验四.rar"的内容,你需要一个支持RAR格式的解压工具,如WinRAR、7-Zip或Bandizip。这些...
在当今信息化社会,软件行业的发展日新月异,为各行各业提供了强大的技术支持。为了帮助朋友们更好地理解和选择适合自己的软件就业方向,我们对以下几个主要领域进行了深入的解析:Java方向、嵌入式方向、测试方向、...
10. **数据库管理**:熟悉SQL语言,了解如MySQL、Oracle等数据库管理系统,以及NoSQL数据库如MongoDB,是处理数据存储和检索的关键。 通过学习《03173软件开发工具》中的课件和笔记,自考计算机本科的学生可以系统...
源码部分可能涵盖了多种编程语言,例如C++、Java、Python、JavaScript等,这些语言的基础语法、进阶特性以及实战技巧都有可能被讨论。同时,它也可能包含框架和库的使用,如Spring、React或Django等,帮助读者了解...
它还允许在客户端和服务器端使用相同的查询语法来获取数据。 数据可以来自 JSON 格式的数据库或 API。 注意:所有工作功能都包含在单元测试中。 请帮助实现其他数据库的引擎或修复缺陷。 谢谢。 安装 $ npm ...
NoSQL数据库也可能出现在题目中,如MongoDB或Redis。 四、操作系统 操作系统原理和应用也是考试的重点,如进程管理、内存管理、文件系统、网络编程接口(如套接字编程)等。理解操作系统如何影响软件运行性能和安全...
在软件开发中,"bug"通常指的是程序中的错误或缺陷,可能导致程序行为不正确或者完全崩溃。 在JavaScript中,错误类型可以分为以下几类: 1. ReferenceError:当尝试引用一个不存在的变量时,会抛出此类错误。 2. ...
【聊天应用】是一种常见的软件类型,它允许用户通过文本、语音、视频等多种方式实时交流。...通过学习和实践,开发者能够掌握如何构建自己的聊天应用,并在此基础上进行扩展和定制,满足不同场景的需求。
- **集成测试**:在单元测试基础上,将所有模块按照概要设计要求组装成子系统或系统,进行集成测试。 - **系统测试**:把经过测试的子系统装配成一个完整的系统来测试。 - **验收测试**:也称为交付测试,是在系统...
在IT行业中,"害虫计划支持"可能是指一个软件项目或者工具,其目的是为了管理和跟踪问题,特别是软件开发过程中的bug或缺陷。由于标签提到了"TypeScript",我们可以推测这是一个使用TypeScript编写的后端主项目,...
2. **编程语言**:EpamSys可能会涵盖多种编程语言,如Java、Python、C#等,教授语法、面向对象编程、异常处理和性能优化等。 3. **Web开发框架**:介绍前端技术如HTML、CSS、JavaScript,以及React、Vue或Angular等...
NoSQL数据库如MongoDB也可能在某些场景下被采用。 10. **Docker和Kubernetes**:为了实现容器化部署和集群管理,项目可能使用Docker封装应用,而Kubernetes则用于容器编排和集群管理。 11. **文档编写**:清晰的...
软件工程师在开发过程中需要考虑到跨平台兼容性,确保软件在不同的系统平台上能够正常运行。 软件工程领域还涉及到了多种标准和规范,它们是软件开发过程中的重要依据,保证了软件开发的秩序和产品的质量。例如,...
BugTracker是一款用于软件开发过程中管理错误和缺陷的工具,它使得团队成员能够有效地跟踪、记录和解决代码中的问题。作为一个基于JavaScript的应用程序,BugTracker充分利用了Web技术的灵活性和交互性,提供了一个...