如何进行mongodb和redis哪个好的子文档查询

mongodb子文档查询
时间: 22:07:45
&&&& 阅读:160
&&&& 评论:
&&&& 收藏:0
标签:方法一
--子文档分页
db.apRadioLinkQuality.aggregate(
{$match: {"logTimeStamp" : {"$gte":0}}},
{$unwind: "$staDetailList"},
{$sort: {"staDetailList.logTime": -1}},
{$limit: 3},
{"$group": {"_id": "$_id", "staDetailList": {"$push": "$staDetailList"}}}
&标签:原文地址:http://www.cnblogs.com/guochunyi/p/5612114.html
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
mongoDB 文档查询
摘要:在关系型数据库中,可以实现基于表上各种各样的查询,以及通过投影来返回指定的列。对于NoSQLmongoDB而言,所有能够在单表上完成的查询,在mongoDB中也可以完全胜任。除此之外,由于mongoDB支持基于文档嵌套以及数组,因此mongoDB也可以实现基于嵌套文档和数组的查询。具体见下文描述。预备热身Linux下快速安装MongoDBWindows平台下安装MongoDBmongoDB启动与停止mongoshell连接到mongoDB及shell提示符下执行js脚本mon
在关系型数据库中,可以实现基于表上各种各样的查询,以及通过投影来返回指定的列。对于NoSQL mongoDB而言,所有能够在单表上完成的查询,在mongoDB中也可以完全胜任。除此之外,由于mongoDB支持基于文档嵌套以及数组,因此mongoDB也可以实现基于嵌套文档和数组的查询。具体见下文描述。
预备热身 Linux下快速安装MongoDB Windows平台下安装MongoDB mongoDB 启动与停止 mongo shell连接到mongoDB及shell提示符下执行js脚本 mongoDB简介及关键特性 SQL与mongoDB对比及映射
一、查询语法
db.collection.find( &query filter&, &projection& )
db.collection.findOne()
//仅仅返回单个文档,相当于使用limit
&query filter& 查询的过滤条件
&projection&
投影,即哪些列需要返回
对于查询的结果可以添加limits, skips, sort 等方式控制返回的结果集
缺省情况下,在mongo shell中对于未使用将结果集返回给变量的情形下,仅返回前20条记录
注:本文描述中有些地方使用到了文档的键值对,称为键和值,有些地方称为列,是一个概念
二、准备数据
//演示环境
db.version()
//插入演示数据
db.users.insertMany(
name: &sue&,
status: &P&,
favorites: { artist: &Picasso&, food: &pizza& },
finished: [ 17, 3 ],
badges: [ &blue&, &black& ],
{ points: 85, bonus: 20 },
{ points: 85, bonus: 10 }
name: &bob&,
status: &A&,
favorites: { artist: &Miro&, food: &meringue& },
finished: [ 11, 25 ],
badges: [ &green& ],
{ points: 85, bonus: 20 },
{ points: 64, bonus: 12 }
name: &ahn&,
status: &A&,
favorites: { artist: &Cassatt&, food: &cake& },
finished: [ 6 ],
badges: [ &blue&, &red& ],
{ points: 81, bonus: 8 },
{ points: 55, bonus: 20 }
name: &xi&,
//Author : Leshami
: http://blog.csdn.net/leshami
status: &D&,
favorites: { artist: &Chagall&, food: &chocolate& },
finished: [ 5, 11 ],
badges: [ &red&, &black& ],
{ points: 53, bonus: 15 },
{ points: 51, bonus: 15 }
name: &xyz&,
status: &D&,
favorites: { artist: &Noguchi&, food: &nougat& },
finished: [ 14, 6 ],
badges: [ &orange& ],
{ points: 71, bonus: 20 }
name: &abc&,
status: &A&,
favorites: { food: &pizza&, artist: &Picasso& },
finished: [ 18, 12 ],
badges: [ &black&, &blue& ],
{ points: 78, bonus: 8 },
{ points: 57, bonus: 7 }
三、演示查询
1、简单查询
//查询所有文档,文档太多,此处及以下演示查询结果省略
db.users.find( {} )
//与方式等价于db.users.find()
db.users.findOne( {} )
//查询单条记录
//等值查询,{ &field1: &value1, ... }
db.users.find({_id:5}).pretty()
db.users.find({age:19,status:&P&})
//多条件等值查询,隐式使用$and运算符
2、基于运算符的查询
//基于运算符的查询,{ &field1: { &operator1: &value1 }, ... }
//基于$in运算符
db.users.find( { status: { $in: [ &P&, &D& ] } } )
//基于$and运算符的查询
db.users.find( {$and: [{ status: &A&, age: { $lt: 30 } } ]})
db.users.find( { status: &A&, age: { $lt: 30 } } ) //此查询方法与上一条等价,隐式使用$and运算符
//基于$or运算符的查询
db.users.find( { $or: [ { status: &A& }, { age: { $lt: 30 } }]})
//多条件组合查询,基于$lt,也有$or,还有隐式$and
db.users.find(
status: &A&,
$or: [ { age: { $lt: 30 } }, { type: 1 } ]
3、内嵌文档查询
//等值匹配内嵌文档
db.users.find( { favorites: { artist: &Picasso&, food: &pizza& } } )
//等值匹配内嵌文档的特定键值,通过&键.成员名:值&的方式来进行
db.users.find( { &favorites.artist&: &Picasso& } )
4、数组查询
//查询数组元素
//查询数组badges中包含black的文档
db.users.find( { badges: &black& } )
//匹配一个特定的数组元素
//查询数组badges中第一个元素为black的文档
db.users.find( { &badges.0&: &black& } )
//此处0表示数组的下标
//匹配单个数组元素满足条件
//查询数组finished至少有一个元素的值大于15且小于20的文档
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )
//匹配混合数组元素满足条件
//查询数组finished中任意的一个元素大于15,且另外一个元素小于20
db.users.find( { finished: { $gt: 15, $lt: 20 } } )
//或者这个元素既大于15又小于20的文档
//查询数组内嵌文档
//查询数组points元素1内嵌文档键points的值小于等于55的文档
db.users.find( { 'points.0.points': { $lte: 55 } } )
//查询数组内嵌文档
//查询数组points内嵌文档键points的值小于等于55的文档,此处未指定数组下标
db.users.find( { 'points.points': { $lte: 55 } } )
//查询数组元素至少一个内嵌文档满足所有条件的文档
//如下,数组points内至少一个文档points键的值小于等于70,bonus键的值等于20的记录,这样的文档被返回
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )
//查询数组元素任意一个内嵌文档满足所有条件的文档
//如下,数组points内嵌文档任意一个文档points的值小于等于70,且数组内另外一个文档bonus值等于20
//或者数组内某个内嵌文档points的值小于等于70,bonus的值等于20,这2种情形会被返回
db.users.find( { &points.points&: { $lte: 70 }, &points.bonus&: 20 } )
四、限制查询返回的结果集
{ field1: &value&, field2: &value& ... }
显示该字段
0 or false 不显示该字段
1、限制返回的列
//查询结果中显示字段name及status,缺省情况下,文档的_id列会被返回
& db.users.find( { status: &A& }, { name: 1, status: 1 } )
{ &_id& : 2, &name& : &bob&, &status& : &A& }
{ &_id& : 3, &name& : &ahn&, &status& : &A& }
{ &_id& : 6, &name& : &abc&, &status& : &A& }
//查询结果中显示字段name及status,且不显示_id列
& db.users.find( { status: &A& }, { name: 1, status: 1, _id: 0 } )
{ &name& : &bob&, &status& : &A& }
{ &name& : &ahn&, &status& : &A& }
{ &name& : &abc&, &status& : &A& }
//返回查询中未列出的全部列名
& db.users.find( { status: &A& }, { favorites: 0, points: 0 ,badges:0})
{ &_id& : 2, &name& : &bob&, &age& : 42, &type& : 1, &status& : &A&, &finished& : [ 11, 25 ] }
{ &_id& : 3, &name& : &ahn&, &age& : 22, &type& : 2, &status& : &A&, &finished& : [ 6 ] }
{ &_id& : 6, &name& : &abc&, &age& : 43, &type& : 1, &status& : &A&, &finished& : [ 18, 12 ] }
//返回内嵌文档指定的列名,相反地,如果不显示内嵌文档的某个列,将在置0即可
& db.users.find(
{ status: &A& },
{ name: 1, status: 1, &favorites.food&: 1 }
{ &_id& : 2, &name& : &bob&, &status& : &A&, &favorites& : { &food& : &meringue& } }
{ &_id& : 3, &name& : &ahn&, &status& : &A&, &favorites& : { &food& : &cake& } }
{ &_id& : 6, &name& : &abc&, &status& : &A&, &favorites& : { &food& : &pizza& } }
//返回数组内内嵌文档的指定列,如下查询为数组points内嵌文档bonus列
& db.users.find( { status: &A& },{ name: 1,&points.bonus&: 1 } )
{ &_id& : 2, &name& : &bob&, &points& : [ { &bonus& : 20 }, { &bonus& : 12 } ] }
{ &_id& : 3, &name& : &ahn&, &points& : [ { &bonus& : 8 }, { &bonus& : 20 } ] }
{ &_id& : 6, &name& : &abc&, &points& : [ { &bonus& : 8 }, { &bonus& : 7 } ] }
//下面的查询使用了$slice操作符,这将仅仅返回符合status为A,且显示数组中的最后一个元素
& db.users.find( { status: &A& }, { name: 1, status: 1, points: { $slice: -1 } } )
{ &_id& : 2, &name& : &bob&, &status& : &A&, &points& : [ { &points& : 64, &bonus& : 12 } ] }
{ &_id& : 3, &name& : &ahn&, &status& : &A&, &points& : [ { &points& : 55, &bonus& : 20 } ] }
{ &_id& : 6, &name& : &abc&, &status& : &A&, &points& : [ { &points& : 57, &bonus& : 7 } ] }
2、查询NULL值或不存在的键
//插入文档
& db.users.insert(
{ &_id& : 900, &name& : null },
{ &_id& : 901 },
{ &_id& : 902,&name& : &Leshami& ,&blog& : &http://blog.csdn.net/leshami&}
//查询name自动为null的文档,注,以下查询中,不存在name列的文档_id:901的也被返回
& db.users.find( { name: null } )
{ &_id& : 900, &name& : null }
{ &_id& : 901 }
//通过$type方式返回name为null的文档,此时_id:901未返回
& db.users.find( { name : { $type: 10 } } )
{ &_id& : 900, &name& : null }
//通过$exists返回name自动不存在的文档
& db.users.find( { name : { $exists: false } } )
{ &_id& : 901 }
1、文档查询db.users.find()等价于db.users.find( {} ) 2、基于
and运算符的多个组合条件可以省略
and,直接将条件组合即可 3、对于$and运算符内的条件,用[]括起来,相当于数组形式 4、对于数组查询,可以使用基于下标的方式精确配置特定的元素值 5、对于内嵌文档,可以使用”文档键.内嵌文档键”方式进行访问 6、对于数组内内嵌文档的方式,可以使用”数组名.下标.内嵌文档键”方式访问 7、对于哪些列名需要显示可以通过{ field1: &0|1&, … }来设定 8、本文参考:https://docs.mongodb.com/manual/tutorial/query-documents/
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
mongoDB 文档查询相关信息,包括
的信息,所有mongoDB 文档查询相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International找不到答案?
Mongodb 如何进行查询 $nin不在另一个结果集内的文档
类似于 mysql 的子查询例如: 我现在要查询文章列表, 我之前看过的文章就不再显示了。db.wenzhang.find({"red":{"$nin":[ 另一个表中得数据 另一个 find ]}})类似 sql 的 Select * from TableName where a not in (select a from TableName2) as abc请问这样的功能如何用MongoDB实现,谢谢!
按投票排序
按时间排序
mongo不支持此类联合查找;建议改进自己的设计。
登录后可回答问题,请
基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在...
云数据库HybridDB(ApsaraDB HybridDB)是一种在线MPP大规模并行处理数据仓库服务。云数据...
针对日志类数据的一站式服务,用户无需开发就能快捷完成数据采集、消费、投递以及查询分析等功能,帮助提升运维、运营效...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...博客分类:
where可以接受一个javascript函数作为查询条件,并且迭代当前集合里面的所有文档,如果满足函数条件,则返回这个文档。最典型的就是比较文档中的两个键的值是否相等
//现在有下面这个集合,要找出库存和销量相同的记录
& db.foo.insert({"name":"apple","ku_cun":100,"xiao_liang":100});
& db.foo.insert({"name":"banana","ku_cun":120,"xiao_liang":100});
//下面是用$where查询
& db.foo.find({$where:function(){if(this.ku_cun == this.xiao_liang)}
{ "_id" : ObjectId("533bd3490f059"), "name" : "apple", "ku_cun" : 100
, "xiao_liang" : 100 }
this就是引用当前集合中的一个文档。
$where除了可以接受一个function函数,还可以接受一个function的字符串
//这是接受一个function的字符串,效果是一样的
& db.foo.find({$where:"function(){if(this.ku_cun == this.xiao_liang)
{ "_id" : ObjectId("533bd3490f059"), "name" : "apple", "ku_cun" : 100
, "xiao_liang" : 100 }
如果表示当前遍历的这个文档满足条件,那么就把这条记录(文档)返回出来。
还有更复杂的查询可以利用MapReduce
特别说明:使用$where效率比较低,因为mongodb要将BOSN数据转成javascript数据,然后一个一个遍历操作。并且不能使用索引。建议使用常规查询作为前置过滤,然后与$where组合使用。
数据库使用游标来返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效的控制。可以限制结果的数量(limit),掠过部分数据(skip),对结果进行排序(sort),或者执行其他操作.
//使用limit,获取查询结果的前5条记录(文档)
& db.student.find().limit(5);
{ "_id" : 1, "name" : "aa1", "age" : 11 }
{ "_id" : 2, "name" : "aa2", "age" : 12 }
{ "_id" : 3, "name" : "aa3", "age" : 13 }
{ "_id" : 4, "name" : "aa4", "age" : 14 }
{ "_id" : 5, "name" : "aa5", "age" : 10 }
//使用skip和limit,跳过查询结果的前两条,取得后面的5条记录(文档)
& db.student.find().skip(2).limit(5);
{ "_id" : 3, "name" : "aa3", "age" : 13 }
{ "_id" : 4, "name" : "aa4", "age" : 14 }
{ "_id" : 5, "name" : "aa5", "age" : 10 }
{ "_id" : 6, "name" : "aa6", "age" : 11 }
{ "_id" : 7, "name" : "aa7", "age" : 12 }
//使用sort,对跳过前2条之后的5条记录按照age倒序
& db.student.find().skip(2).limit(5).sort({"age":-1});
{ "_id" : 3, "name" : "aa3", "age" : 13 }
{ "_id" : 8, "name" : "aa8", "age" : 13 }
{ "_id" : 2, "name" : "aa2", "age" : 12 }
{ "_id" : 7, "name" : "aa7", "age" : 12 }
{ "_id" : 1, "name" : "aa1", "age" : 11 }
//使用sort,对跳过前2条之后的5条记录按照age顺序
& db.student.find().skip(2).limit(5).sort({"age":1});
{ "_id" : 1, "name" : "aa1", "age" : 11 }
{ "_id" : 6, "name" : "aa6", "age" : 11 }
{ "_id" : 2, "name" : "aa2", "age" : 12 }
{ "_id" : 7, "name" : "aa7", "age" : 12 }
{ "_id" : 3, "name" : "aa3", "age" : 13 }
因为mongodb相同的键可以对应不用类型,所以在排序时
有可能存在不同类型的比较。mongodb有一个预先定义好的,从小到大: 如果skip过多的文档,会导致速度比较慢,这是你的分页可能的想想其他方法了。例如可以根据时间排序,然后下一页时,根据上一页的最后一条记录的时间作为这一页查询的条件。
浏览: 238585 次
来自: 北京
浏览量:6896
浏览量:22533
浏览量:12489
浏览量:21298
浏览量:9774
,一直读你的文章,写的真好
博主你好。我这有点问题始终没搞明白。关于继承的在父模块定义了依 ...
java实现excel的导入导出,也可是用插件进行实现的,Pa ...
如何创建空的mave项目,用eclipse建的时候,选择哪个类 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'10:56 提问
Mongo子文档比较查询的问题
"_id" : ObjectId("59f82da37d12b24"),
"trainNo" : "6c000G61190J",
"trainCode" : "G6119",
"seatType" : "O9OM",
"passStationList" : [
"name" : "长沙南",
"stationNo" : "01",
"arriveTime" : "----",
"leaveTime" : "18:43",
"waitTime" : "----"
"name" : "衡阳东",
"stationNo" : "02",
"arriveTime" : "19:20",
"leaveTime" : "19:22",
"waitTime" : "2分钟"
"name" : "郴州西",
"stationNo" : "03",
"arriveTime" : "19:55",
"leaveTime" : "19:57",
"waitTime" : "2分钟"
"name" : "韶关",
"stationNo" : "04",
"arriveTime" : "20:28",
"leaveTime" : "20:30",
"waitTime" : "2分钟"
"name" : "广州南",
"stationNo" : "05",
"arriveTime" : "21:27",
"leaveTime" : "21:27",
"waitTime" : "----"
例如这种文档结构,我想查出passStationList.name包含长沙和衡阳,并且长沙的stationNo大于衡阳的stationNo,Mongo可以直接查询出来么?
按赞数排序
可以查出长沙,衡阳的数据。然后程序自己来比较逻辑
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 mongodb和mysql的区别 的文章

 

随机推荐