有两种方式可以查询内嵌文档:查询整个文档,或者只针对其键值对进行查询。
查询整个内嵌文档与普通查询完全相同。
要查询Joe Schmoe:
如果要查询一个完整的子文档,那么子文档必须精确匹配。如果Joe决定添加一个代表中间名的键,这个查询就不再可行了。而且这种查询还是与顺序相关的,调换顺序什么都匹配不到:
只针对内嵌文档的特定键值查询可以使用点表示法,这样即使数据模式改变,也不会因为要精准匹配而导致挂掉:
假如:有博客文章若干,要找到由Joe发表的5分以上的评论。博客文章如下:
不能直接用
db.blog.find({comments:{author:"joe", score:{$gte:5}}})
来查询:
内嵌文档的匹配,必须要整个文档完全匹配,而这个查询不会匹配comment键。使用``db.blog.find({“comments.author”:“joe”, “comments.score”:{$gte:5}})`也不行,因为符合author条件的评论和符合score条件的评论可能不是同一条评论。也就是说,会返回刚才显示的那个文档。因为author:"joe"在第一条评论中匹配了,score:6在第二条评论中匹配了:
要正确指定一组条件,而不必指定每个键,就需要使用
$elemMatch
。
插入一个数组:
等价查询数组:
查询包含某一个值的数组:
查询指定位置的数组,需要使用key.index指定下标:
查询包含多个值的数组(顺序无关):
查询指定长度的数组:
文档中的标量(非数组元素)必须与查询条件中的每一条语句相匹配。
例如,如果使用
{"x":{"$gt":10, "$lt":20}}
进行查询,只会匹配x键的值大于等于10且夏鸥等于20的文档。但是,加入某个文档的x字段是一个数组,如果x键的某一个元素与查询条件的任意一掉语句相匹配(查询条件中的每条语句可以匹配不同的数组元素),那么这个文档也会被返回。
如果希望查找到x值位于10和20之间的所有文档,直接想到的查询方式是使用
db.a.find({"x":{$gt:10, $lt:20}})
,希望这个查询返回文档是
{"x": 15}
,但是,实际返回了两个文档:
5和25都不位于10和20之间,但是这个文档也返回了,因为25与查询条件中的第一个语句(大于10)相匹配,5与查询条件中的第二个语句(小于20)相匹配。
所以:
对数组使用范围查询没有用;范围会匹配任意多元数组
其它方案:
可以使用
$eleMatch
,同时使用多个条件与数组元素进行比较:
但是有一个问题,$elemMatch不会匹配非数组元素。{“x”:15}它的x字段不是数组。
$where可以在查询中执行任意的JavaScript。为安全起见,应该限制或者消除$where语句的使用。
$where语句最常见的应用就是比较文档中两个不同见的值是否相等。
假如有如下文档:
查询两个键具有相同值的文档,比如第二个文档中spinach:4与watermolon:4值相等:
如果函数返回true,文档就作为结果集的一部分返回;如果为false,就不返回。
不是非常必要时,一定要避免使用"$where"查询,因为它们在速度上要比常规查询慢很多。每个文档都要从BSON转换成JavaScript对象,然后通过"$where"表达式来运行。而且"$where"语句不能使用索引,所以只在走投无路时才考虑"$where"这种用法。先使用常规查询进行过滤,然后再使用"
w
h
ere
"
语句,这样组合使用可以降低性能损失。如果可能的话,使用
"
where"语句前应该先使用索引进行过滤,“$where” 只用于对结果进行进一步过滤。
数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效的控制。可以限制结果的数量,略过部分结果,根据任意键按任意顺序的组合对结果进行各种排序,或者是执行其他一些强大的操作。
要想从 shell I中创建一个游标,首先要对集合填充一些文档,然后对其执行查询,并将结果分配给一个局部变量(用var声明的变量就是局部变量)。这里,先创建个简单的集合,而后做个查询,并用 cursor变量保存结果
这么做的好处是可以一次查看一条结果。如果将结果放在全局变量或者就没有放在变量中, MongoDB shell会自动迭代,自动显示最开始的若干文档。也就是在这之前我们看到的种种例子,一般大家只想通过shel看看集合里面有什么,而不是想在其中实际运行程序,这样设计也就很合适。
要迭代结果,可以使用游标的next方法。也可以使用hasNext来查看游标中是否还有其他结果。典型的结果遍历如下所示:
另外,调用find时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发送查询,这样在执行之前可以给查询附加额外的选项。
有两种类型的查询:简单查询(plain query)和封装查询(wrapped query)。简单查询就像下面这样:
var cursor db.foo.find({"foo":"bar"})
有一些选项可以用于对查询进行“封装”。例如,假设我们执行一个排序:
var cursor db.foo.find({"foo""bar"}).sort({"x"1})
实际情况不是将{“foo”:“bar”}作为查询直接发送给数据库,而是先将查询封装在一个更大的文档中。shell会把查询从{“foo”:“bar”}转换成{"$query":{"foo":"bar"},"sorderby":{"x"1}}
绝大多数驱动程序都提供了辅助函数,用于向查询中添加各种选项。下面列举了其他一些有用的选项。
执行本次查询中扫描文档数量的上限:
db.foo.find(criteria)._addSpecial("$maxscan", 20)
如果不希望查询耗时太多,也不确定集合中到底有多少文档需要扫描,那么可以使用这个选项。这样就会将查询结果限定为与被扫描的集合部分相匹配的文档。这种方式的一个坏处是,某些你希望得到的文档没有扫描到。
查询的开始条件。在这样的查询中,文档必须与索引的键完全匹配。查询中会强制使用给定的索引。
在内部使用时,通常应该使用"$gt"代替"$min"。可以使用"$min"强制指定一次索引扫描的下边界,这在复杂查询中非常有用。
查询的结束条件。在这样的查询中,文档必须与索引的键完全匹配。查询中会强制使用给定的索引。
在内部使用时,通常应该使用"$\lg"而不是"$max"。可以使用"$max"强制指定一次索引扫描的上边界,这在复杂查询中非常游泳。
- $showDiskLoc:true
在查询结果中添加一个"$diskLoc"字段,用于显示该条结果在磁盘上的位置。
Mongo mg = new Mongo();//默认连本机127.0.0.1 端口为27017
Mongo mg = new Mongo(ip);//可以指定ip 端口默认为27017
Mongo mg = new Mongo(ip,port);//也可以指定ip及端口
2. 连双台mongodb
//ip为主机ip地址,port为端口号,dataBaseName相当于数据库名
DBAddress left = new DBAddress(ip:port/dataBaseName);
DBAddress right = n
select* from userInfo;
默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。
2、查询去掉后...
字段是什么类型,那么查询时字段值的类型就应该是什么类型,比如如果字段类型是 NumberLog,那么查询时就应该执行查询类型为 NumberLog,如db.userInfo.find({id: NumberLog(10)}){ “_id” : ObjectId(“5cf7b4839ad87fde6fd23a03”), “title” : “MongoDB 介绍” }{ “title” : “MongoDB 介绍” }{ “title” : “MongoDB 概述” }假设集合qikegu有以下数据。
Mongodb是文档型数据库,每条数据为一个document记录,很多个文档记录组成一个集合(即:结构化数据库中的表)。数据库通过键、值来存储数据(即:字段、字段值),因为每条记录被存储在一个文档中,所以每条记录可以有不同的键,相同的键可以有不同数据类型的值,比如:age可以存储数:3,字符串:5岁。数据库的“键”的命名区分大小写、顺序,比如:name、Name是两个不同的键。Mongodb内嵌shell脚本,支持javascript语法。db是全局变量,通过shell访问数据库的入口。
db.集合.find(query, projection)
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.集合名.find().pretty()
pretty()格式化显示所有文档
count()个
这个操作符跟SQL 语法的in 类似,但不同的是, in 只需满足( )内的某一个值即可, 而$all 必须满足[ ]内的所有值,例如:
db.users.find({age : {$all : [6, 8]}});
可以查询出 {name: ‘David’, age: 26, age: [ 6, 8, 9 ] }
但查询不出 {name: ‘David’, age: 26, age: [ 6,...
在本文中,我们学习了使用各种方法在 MongoDB 中执行*查找操作*。我们执行*find*以使用查询运算符检索与选择标准匹配的特定文档。此外,我们还学习了执行*投影*以确定匹配文档中返回的字段。
这里写自定义目录标题欢迎使用Markdown编辑新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
欢迎使用Markdown编辑
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markd
db.getCollection('test_user').find({'$where':"function(){ return this.addresss.length>2}"});
上述等价:db.getCollection('test_user').find({'$where':"this.addresss.length>...