MongoDB的查询选择器

MongoDB自己的查询语言

MongoDB不支持SQL,本节主要讲在MongoDB中如何实现类似SQL的查询功能

SQl中的写法如

select column from table join table2 where condition

在MongoDB中有一套类似的写法,先做名称解释

SQLMongoDB
select查询选择器实现
where查询投射项
join无,依靠MongoDB中字段数据类型可以嵌套实现关联查询,字段类型为数组时,MongoDB做了特殊处理

为了更好的说明,现在MongoDB中插入了一条记录:

db.customers.insert({id:11,name:'lisi',orders:[{orders_id:1,create_time:'2017-02-06',products:[{product_name:'MiPad',pric10',address:{city:'beijing',street:'taiyanggong'}})

查询语句:

db.customers.find()

类似于SQL中的:

select * from customers

添加查询条件:

第一个订单中的第一个产品名称必须为iphone,同时返回的结果不显示MongoDB中自带的_id选项,只返回id与orders列

db.customers.find({'orders.0.products.1.product_name':'iphone'},{_id:0,id:1,orders:1})

查询结果为:

{ "id" : 11, "orders" : [ { "orders_id" : 1, "create_time" : "2017-02-06", "products" : [ { "e" : "iphone", "price" : "$399.00" } ] } ] }

其结构如下:

db.collection.find( <query filter>, <projection> )

参数都可以为空,不过当返回字段不为空时,查询条件必须存在或{};

另外,查询条件中如<,<=,in,not in,or,and,exists等如下所示:

db.customers.find({$or:[{age:{$exists:false}},{id:{$lte:10}}]},{_id:0,id:1,name:1,age:1}).sort({age:1})

转换成SQL为:

select id,name,age from customers where exists(age) or id <=10 order by age asc
db.customers.find({age:{$in:[15,18]}})

注意:由于MongoDB的松散的数据组织方式,所以可以存在在某一些记录中其中某一列不存在而在另一些记录中存在的情况,如最开始创建customers的时候,没有age列,随着业务的发展,需要为其添加age列,则可以直接在后面的记录添加时,加入age,查询时,前面的记录将查询不出age列,后面的记录则可以查询到。

以下为常用的表达式:

表达式语义
$gtgreat than大于 >
$ltless than小于 <
$gtegreat than equals大于等于 >=
$lte小于等于 <=
$nenot equals不等于<>
$in在某一个集合里
$nin不在某一个集合中
$exists验证一个元素是否存在
正则表达式支持
$elemMatch匹配数组内的元素
user.score查询嵌套对象的值(左为示例user列中score对象的值)
$not取反
$all匹配所有
$size匹配数组大小
$slice返回数组的一个子集,即对以某属性为基础,返回多少条(范围)。也可以接受偏移值和要返回的元素数量,来返回中间的结果
$where可执行任务JavaScript作为查询的一部分,可为function也可为字符串,查询较慢

如:

db.customers.find({'orders.products.product_name':'iphone'},{_id:0,id:1,'orders.products.product_name':1,'orders.products':{'$slice':-1}})

查询结果为:

{ "id" : 11, "orders" : [ { "products" : [ { "product_name" : "iphone" } ] } ] }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值