MongoDB查询

作者:计算机专家

MongoDB 查询操作的实例详明

一而再有关《MongoDB权威指南》记录,明日的开始和结果是文书档案的询问~~

find

查询即再次来到叁个集合中文书档案的子集,子集范围从0到全部文书档案。

find 第二个参数决定要重临那二个文书档案,其方式也是七个文书档案,表明要实行的查询细节。空的询问文档 {} 会相配集结的全体内容,借使不钦赐询问文书档案,默以为 {}

# 查询users集合中所有内容
db.users.find()

向查询文书档案中增添键值对时,意味着约束查询条件。

db.users.find({name:'alice'});

db.users.find({age:20});

# 查询名为alice且年龄为20的用户
db.users.find({name:'alice', age:20});

应用find或findOne进行查询。并得以拓宽度约束查询、数据集查询、不等式查询,甚至此外的生机勃勃对查询。 查询将会回到DBcursor 游标独有在你要求的时候回来文书档案

MongoDB官方网站地址:

返回值

询问结果毫无每一回都需整个赶回,可经过find的第二个参数内定要求的键。

db.users.find({}, {name:1, email:1})

针对游标再次来到的文书档案 实行操作 举个例子:忽视一定数量的结果,只怕重返结果的数量,以至对结果的排序。

自个儿利用的是MongoDB 2.4.8

限制

询问利用上是有些限定的,数据库所关心的询问的值必得是常量,即不能够援用文书档案中其余键值。

# 存货表(stocks)设计时,initial表示初始化存货量,current表示当前存货量。购买行为发生时,current减少即可。
# 查询脱销的产品
db.stocks.find({current:0})

1.钦点必要再次回到的键

find函数

在上后生可畏篇博客中已经应用过此函数,都以最基本的接收,如

db.user.find()

它会再次回到集结user中的全数剧情。

也得以在find中增加三个参数,如{"age":27},那样就能回来年龄为27的user的集聚。

假诺参数为{"name":"jun","age":27},就能够回到name为jun年龄为27的user的汇聚。

突发性并无需重回全体的键值,可以在find中安装第2个参数,如下

db.user.find({}, {"name": 1, "score": 1})

详见如下图

图片 1 

从上图能够看来_id这么些键总是被重返,即便没有一点名也后生可畏致。

假诺将第三个参数中的1,改为0,会爆发怎么着结果吧?

图片 2

是的,就好像上海教室,再次来到值中的未有了name和score,那五个键被去掉了。

其生机勃勃措施能够用来严防重回_id,只需建第二个参数设为{"_id": 0}。

范围查询

$lt$lte$gt$gte 分别对应 <<=>>=,可将其构成以便于查询三个范围的值。

# 查询年龄在18到30岁的用户
db.users.find({ age:{$gte:18, $lte:30} })

# 查询在2017-01-01前注册的用户
db.users.find({ registred_at: {$lt: new Date('2017/01/01') } });

对此文书档案键值不对等有些特定值得情状,可利用$ne不等于条件操作符,$ne 可用于全数品类的数量。

# 查询名字不为 `joe` 的用户
db.users.find({ name:{$ne:'joe'} })

有时单纯对文档的某多少个键值感兴趣,能够屏蔽再次来到的不感兴趣的键值,重临感兴趣的键值

询问条件

询问不仅能够像在此之前那么准确相配,还是能够合作特别目迷五色的原则,如限定、OLX570子句和取反。

或查询

MongoDB有三种办法进行或询问,$in 可用来查询多个键的八个值,$or 更为通用可成功多个键值的即兴给定值。对于单个键要有八个值与其非常的话,使用$in加多个准则数组。

db.users.find(name:{$in:['alice','ben','carl']});

$in 相反的是 $nin,重回与数组中标准不相配的文书档案。

db.users.find({name:{$nin:['junchow']}})

$in 能对单个键做或询问,要兑现多规格的或询问应运用 $or$or 采纳三个含有全数超级大恐怕条件的数组作为参数。

db.users.find({$or:[{name:'junchow'}, {gender:'female'}]})

$or可含蓄其余标准化

db.users.find({$or:[{name:'junchow', tags:{$in:['happy','handsome']}}]})
mongos> db.blog.find { “_id” : ObjectId(“5659836e73c8340448fa470e”) } { “_id” : ObjectId(“565e5c0e73c8340448fa470f”) } { “_id” : ObjectId(“565f998e73c8340448fa4710”) } { “_id” : 1, “name” : “zmkzmkzmkzmkzmk” } { “_id” : 2, “name” : “zmkzmkzmkzmkzmk” } { “_id” : 3, “name” : “zmkzmkzmkzmkzmk” } { “_id” : ObjectId(“566004d173c8340448fa4712”), “name” : “zmk” }

mongos> db.blog.find({},{“name”:1,”_id”:0}) { “name” : “zmkzmkzmkzmkzmk” } { “name” : “zmkzmkzmkzmkzmk” } { “name” : “zmkzmkzmkzmkzmk” } { “name” : “zmk” }

1.相比操作符

"$lt"、"$lte"、"$gt"、"$gte"和"$ne"正是全部的相比操作符了,他们各自对应<、<=、>、>=和<>(不等于)。能够将其构成起来查找贰个节制的值。如下

db.user.find({"age": {"$gte": 18, "$lte":30}})

如此那般就能够查找到年龄在18到二十五虚岁时期的user的聚合了。

那般的询问对日期极度有用。如下

start = new Date("01/01/2009");
db.user.find({"createTime": {"$gt": start}})

那般就能够招来到二零一零年1五月1日过后登记的客商,当中createTime键为客商注册日期。

非查询

$not是元标准句,可用在其余别的规范化之上。

# 查询出sort为1、6、11、16...的用户
db.users.find({sort:{$mod:[5,1]}})

db.users.find({sort:{$not:{$mod:[5,1]}}})

钦命重回的键值,是查询结果更便捷。此接口可用来规范查询,方便结果管理。

2.OR查询

MongoDB有二种OEscort查询。"$in"和"$nin"为黄金时代种,能够查询贰个键的多少个值。"$or"和"$nor"是另风度翩翩种,能够构成形成多少个键值的随机个定值。

先来造以下数据,命令如下

for(var i=0;i<5;i++){
    db.user.insert({"name": "jun"+i, "email":"jun"+i+"@sina.com", "score": 15+i})
}

动用"$in",命令如下

db.user.find({name: {$in:["jun1", "jun2"]}})

结果如下图

图片 3

招来出name为jun1和jun2的user群集,若使用"$nin",则结果为name不为jun1和jun2的集纳。

动用"$or",命令如下

db.user.find({$or: [{name: {$in: ["jun1", "jun2"]}},
             {email: "jun@126.com"}]})

结果如下图

图片 4

寻觅出name为jun1和jun2恐怕email为jun@126.com的user集合,若接纳"$nor",则结果为name不为jun1和jun2且email不为jun@126.com的聚焦""。

其实"$nin"和"$nor"分别是"$in"和"$or"的取反。

规格法规

根据$带头的键处在不一样的地点,可决断条件句是内层文书档案的键,改进器则是外围文书档案的键。

# 可对一个键应用多个条件
db.users.find({age:{$gt:18, $lt:30}})

#一个键不能对应多个更新修改器
db.users.find({$inc:{age:1}, $set:{age:40}});//error

2.查询条件

3.$not

"$not"是元标准句,即能够用在别的其余规格之上。

设若命令为

db.user.find({score: {$mod: [5, 1]}})

结果回到score除5取余为1的user集结。本来想贴图的,上传挂了。。。就好像此说吧。。。

若想回到score除5取余不为1的user会集,可用如下命令

db.user.find({score: {$not: {$mod: [5, 1]}}});

db.user.find({score: {$not: {$eq: 5}}});

特定项目标询问

"$lt"、"$lte"、“$gt”,“$gte” 分别对应 ,>=。

4. $type

$type操作符是基于BSON类型来查找集结中相称的结果。

MongoDB中得以选拔的类型:

 

类型描述 类型值
Double 1
String 2
Object 3
Array 4
Binary data 5
Object id 7
Boolean 8
Date 9
Null 10
Regular expression 11
JavaScript code 13
Symbol 14
JavaScript code with scope 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255
Max key 127

 

假职分令为

db.user.find({"extra" : {$type : 3}})

结果回到user中extra属性为BSON对象的汇集。

注:

    条件句是内层文书档案的键,而改正器则是外围文档的键。

    一个键能够有多个规格,不过三个键无法对应四个更新改善器。

null能合营自个儿

# null不仅匹配自身还匹配不存在的,会返回缺少这个键的所有文档。
db.users.find({name:null})

# 若仅匹配键值为null的文档,即要检查键值是否为null,还需通过$exists条件判断键值已存在。由于没有$eq操作符,形式上会有些费解。
db.users.find({name:{$in:[null], $exists:true}})

小贴士:在mongodb shell中定义方法的大致格式:

特定类型的询问

正则

正则能灵活有效地匹配字符串

# 查询忽略大小写名为joe的文档
db.users.find({name:/joe/i})

# 查询匹配大小写组合形式的joe
db.users.find({name:/joe?/i})

MongoDB使用Perl包容的正则(PCRE)库来同盟正则,PCRE帮助的正则语法都能被MongoDB所承担。建议在询问中使用正则前,先在JS Shell中检查一下语法,确认保障相配与杜撰的等同。

MongoDB可为前缀型正则查询成立索引,所以此类查询特别迅猛。

db.users.find({name:/^joey/})
mongos> var insertName=function(){ … for{ … db.blog.insert({“_id”:1,”name”:”zmk”+i}) … } … } mongos> insertName() 

mongos> db.blog.find() { “_id” : 1, “name” : “zmk0” } { “_id” : 0, “name” : “zmk0” } { “_id” : 2, “name” : “zmk2” } { “_id” : 3, “name” : “zmk3” } { “_id” : 4, “name” : “zmk4” } { “_id” : 5, “name” : “zmk5” } { “_id” : 6, “name” : “zmk6” } { “_id” : 7, “name” : “zmk7” } { “_id” : 8, “name” : “zmk8” } { “_id” : 9, “name” : “zmk9” }

1.null

null不止能同盟自个儿,并且能匹配"不设有的"。

要是单纯想要相配键值为null的文书档案,既要检查该键的值是还是不是为null,还要通过"$exists"条件剖断键值已经存在,命令如下

db.user.find({email: {$in: [null], $exists: true}})

回去顾客中email为null的user的集聚。

此处未有$eq操作符,所以接受唯有二个成分的$in,其功能是千篇意气风发律的。

询问数组

各种成分都以整个键的值

db.users.insert({tags:['ios', 'wins', 'linux']})

db.users.find({tags:'linux'})

$all经过八个因平素相配数组

# 查询即有ios又有linux的文档
db.users.find({tags:{$all:['wins', 'ios']}})

# 查询数组指定位置的元素可使用 key.index 指定下标,数组下标以0开始。
db.users.find({'tags.1': 'wins'})

# 查询指定长度的数组,$size不能与其他子句组合。
db.users.find({tags:{$size:3}})

#当查询需一个长度范围时可通过在文档中添加一个size键的方式来实现,不幸的是这种技巧并不能与 $addToSet同时使用。
db.users.update({$push:{remark:''}, $inc:{size:1}})
db.users.find({size:{$gt:3}})

$slice 操作符重返文书档案中钦定数组的内部值

# 查询博客某文章前10条评论
db.blogs.findOne(criteria, {comments:{$slice:10}})

# 查询博客某文章后10条评论
db.blogs.findOne(criteria, {comments:{$slice:-10}})

# 查询中junchow书架中第2到第4本书
db.users.find({name:'junchow'}, {books:{$slice:[1,3]}, _id:0})

# 查询出最后一本书
db.users.find({name:'junchow'}, {books:{$slice:-1}, _id:0})

着如今面包车型大巴信守,find能够应用“$lt”<来查询文件插入的时光

2.正则表明式

MongoDB使用Perl宽容的正则表明式(PCRE)库来协作正则表明式,PCRE扶持的正则表明式语法都能被MongoDB所收受。

若果您对正则表明式不打听,能够查阅自个儿以前的日记:JavaScript的学习--正则表明式

MongoDB可感觉前缀正则表达式(比方/^joey/)查询创造索引,所以那连串型的查询成效非常高。

正则表明式也能够合作本身。即使有红尘接将正则表达式插入数据库,正则表明式也是足以同盟的。

一声令下如下

db.user.insert({name: /sgj/})
db.user.find({name: /sgj/})

 

回来结果是(图片不能够上传了,就不截图,间接写结果了)

{ "_id" : ObjectId("52dce1e664d83577540f5aa9"), "name" : /sgj/ }

 

查询内嵌文书档案

db.users.insert({name:'tom', fullname:{first:'joe', last:'schmoe'}})

# 使用点标识符查询内嵌的键,查询文档可包含点来表达深入内嵌文档内部的意思。
db.users.find({'fullname.first':'joe'})

为jim增添简历文书档案 jim.json

db.users.insert({name:'jim'});
var scores = [
  {subject:'php', score:'A'},
  {subject:'database', score:'B'},
  {subject:'javascript', score:'A+'}
];
db.users.update({name:'jim'}, {$set:{scores:scores}});

# 查询出考过php的用户
db.users.find({'scores.subject':'php'},{_id:0});

查询博客小说中由junchow公布的5分以上的评头论足

# elemMatch 将限定条件进行分组,仅当需对内嵌文档的多个键操作时才会用到
db.blogs.find({comments:{$elemMatch:{author:'junchow', score:{$gte:5}}}})
mongos> db.blog.insert({“_id”:10,”time”:new Date WriteResult mongos> db.blog.find({“time”:{“$lt”:new Date { “_id” : 10, “time” : ISODate(“2015-12-05T12:08:53.469Z”) }

3.查询数组

移除掉user中的数据,重新插入几条

db.user.remove()
db.user.insert({name:"jun", loveFruit: ["apple", "banana", "peach"]})
db.user.insert({name:"jun1", loveFruit: ["apple", "kumquat", "orange"]})
db.user.insert({name:"jun2", loveFruit: ["apple", "banana", "cherry"]})

 

日常来讲的数组查找

db.user.find({loveFruit: "cherry"})

 

归来结果为

{ "_id" : ObjectId("52dce40364d83577540f5aac"), "name" : "jun2", "loveFruit" : [ "apple",  "banana",  "cherry" ] }

 

$where查询

键值对是很有表现力的查询艺术,但照样大概需要是它不可能满足的,这个时候就必要$where子句了。
必需求制止选拔$where查询,因为在进程上要比不荒谬查询慢,由于每一个文书档案都要从BSON调换来JSON,然后通过$where表明式来运行,同样不可能利用索引。所以一定要在走头无路时才思谋使用 $where。

本文由杏彩发布,转载请注明来源

关键词: