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)的混合型文档很可能会让人感觉非常别扭,当然这也取决于数据的复杂程度。
|
顶 翻译的不错哦!
|
相关推荐
mongodb 常用查询语法包括分页等用法
mongoDb数据库基本语法,可做参考书使用
mongodb数据库语法学习,快速掌握mongodb的使用。
很全面的mongodb 查询语法和实例 $gt $lt $gte $lte $exists $size $type 等等
MongoDB的基本常用语法:1、创建、查询数据库 创建数据库 查询数据库 2、创建集合、查看 创建集合插入数据 查看集合 查看集合中的数据 3、删除集合、删除数据库 删除集合 删除数据库 4、操作符 4、增、删、改、查 1...
MongoDB在mac,linux,window的安装,...MongoDB中英文文档,python,java对mongodb的基础操作语法,三大平台上的安装视频链接。 MongoDB,mac,linux,windows,python,java,文档,手册,安装视频,mongodb语法
真实有效的mongodb视频教程地址 深入浅出 MongoDB 高清IT教程视频下载 1.1、-nosql与MongoDB.mp4 1.2、-MongoDB安装配置.mp4 1.3、-MongoDB?shell详.mp4 1.4、-MongoDB文档、集合、... 2.4、-MongoDB查询语法3.mp4
MongoDB的语法速查表,表格形式
由第一节点mongodb节点规划图所示:在服务器31,即node1上安装mongos、shard1、shard4、shard5mkdir -p /opt/app
MongoDB操作手册详细介绍MongoDB的语法用法
mongodb 的常用命令,常用语法,都是日常工作中汇总,你可以下载当工具使用,方便查阅,非常有用。
MongoDB在红帽系统上的配置和启动,英文版。
mongodb在单机上搭建分片副本集群. 1.安装mongodb。2.准备好配置文件夹。3.创建日志文件。4.启动配置进程(config servers)。5.启动路由进程(mongos)。6.启动分片进程(shard servers)。7.开始设置分片副本集。8.设置...
介绍详细讲解在Mac上安装MongoDB数据库,配置环境变量、数据以及日志,快速启动和停止。
MongoDB大数据处理权威指南 MongoDB大数据处理权威指南 MongoDB大数据处理权威指南
MongoDB Community Server(mongodb-org-server_...Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB Community Server(mongodb-src-r5.0.4....Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
5、MongoDB删除 9 6、MongoDB分页 10 7、MongoDB模糊查询和其他条件查询 12 五、Mongoose(node使用)(前提安装好node环境有node基础) 13 1、连接 13 2、创建模式结构(Schema)定义约束了数据库中的文档结构 14 3、...