mongoDb内嵌文档的数据查询

导读

本文档主要讲述在内嵌文档中数据的筛选,内容如下
-  获取内嵌文档某特定数据
-  获取多个内嵌文档的某特定数据
-  获取多层级内嵌文档中的某特定数据
-  获取内嵌文件特定数据,并利用排序和分页筛选

测试数据

{
    "name": "p1",
    "uv": [
        {
			"uuid": "1" ,
            "channel": "c1",
            "os": "o1",
            "time": ISODate("2020-08-01 00:00:00")
        },
        {
			"uuid": "2" ,
            "channel": "c1",
            "os": "o1",
            "time": ISODate("2020-08-02 00:00:00")
        },
    ]
	,"pv":[
		{
			"uuid": "1" ,
			"ip": "127.0.0.2",
			"browseInfo": [
				{
					"time" : ISODate("2020-08-02 00:00:00")
					,"url": "/to/index"
				}
			] 
		}
		,{
			"uuid": "2",
			"ip": "127.0.0.1",
			"browseInfo": [
				{
					"time" : ISODate("2020-08-02 00:00:00")
					,"url": "/to/index"
				}
			] 
		}
	]
}

1,获取文档第一层数据

table: test
result: uv
where: name="p5"
db.test.aggregate(
[
	{"$match": {"name": "p5"}} 
	,{"$project": {"uv": "$uv" ,"_id": 0}}
])

2, 获取内嵌文档某特定数据

table:test
result: uv
where: name=p5 and uv.uuid = 1
db.test.aggregate(
[
	{"$match": {"name": "p5"}}
	,{"$unwind": "$uv"}
	,{"$match": {"uv.uuid": "1"}}
	,{"$project": {"uv": 1 ,"_id": 0}}
])

3,获取多个内嵌文档特定数据

table: test
result: uv ,pv
where: name=p5 ,uv.uuid = 1 ,pv.uuid = 1
db.test.aggregate(
[
	{"$match": {"name": "p5"}}
	,{"$unwind": "$uv"}
	,{"$match": {"uv.uuid": "1"}}
	,{"$unwind": "$pv"}
	,{"$match": {"pv.uuid": "1"}}
	,{"$project": {"uv": 1 ,"pv": 1 ,"_id": 0}}
])

4. 获取多层级内嵌文档

table:test
result: pv.browseInfo
where: name=p5 ,pv.uuid=1 ,pv.browseInfo.time>=2010-07-08 00:00:00 ,pv.browseInfo.time<=2020-09-08 00:00:00

方式一: 数据整理后进行条件筛选(推荐:虽然还未做性能测试,但可以预测在$unwind拆分时,非拆分的其它内嵌文档数据量超大,必然会影响其性能,所可在整理数据时过滤该数据)

db.test.aggregate( 
[ 
	{"$match": {"name": "p5"}} 
	,{"$unwind": "$pv"} 
	,{"$match": {"pv.uuid": "1"}} 
	,{"$unwind": "$pv.browseInfo"} 
	,{"$project": {"browseInfo": "$pv.browseInfo" ,"_id": 0}}
	,{"$match": {"browseInfo.time":{"$gte": ISODate("2010-07-08 00:00:00") ,"$lte": ISODate("2020-09-08 00:00:00")}}} 
])

方式二: 条件筛选后进行数据整理

db.test.aggregate( 
[ 
	{"$match": {"name": "p5"}} 
	,{"$unwind": "$pv"} 
	,{"$match": {"pv.uuid": "1"}} 
	,{"$unwind": "$pv.browseInfo"} 
	,{"$match": {"pv.browseInfo.time":{"$gte": ISODate("2010-07-08 00:00:00") ,"$lte": ISODate("2020-09-08 00:00:00")}}} 
	,{"$project" : {"browseInfo" :"$pv.browseInfo" ,"_id": 0}}
])

5, 获取内嵌文档数据,并以指定字段排序,且获取分页数据

table:test
result: pv.browseInfo
where: name=p5 ,pv.uuid=1 ,pv.browseInfo.time>=2010-07-08 00:00:00 ,pv.browseInfo.time<=2020-09-08 00:00:00
sort: pv.browseInfo.time=1
limit: page=1 ,size=1
db.test.aggregate( 
[ 
	{"$match": {"name": "p5"}} 
	,{"$unwind": "$pv"} 
	,{"$match": {"pv.uuid": "1"}} 
	,{"$unwind": "$pv.browseInfo"} 
	,{"$project": {"browseInfo": "$pv.browseInfo" ,"_id": 0}}
	,{"$match": {"browseInfo.time":{"$gte": ISODate("2010-07-08 00:00:00") ,"$lte": ISODate("2020-09-08 00:00:00")}}} 
	,{"$sort": {"browseInfo.time": 1}}
	,{"$skip": 1}
	,{"$limit": 1}
])	

6. 获取内嵌文档数据并以内嵌文档某字段分组

table: test
result: uv.channel ,$sum(uv.channel)
where : name=p5 
group: uv.channel
db.test.aggregate([
	{"$match": {"name": "p5"}}
	,{"$project": {"uv": 1}}
	,{"$unwind": "$uv"}
	,{"$group": {"_id": "$uv.channel" ,"count": {"$sum": 1}}}
	,{"$project": {"channel": "$_id" ,"channelSize": "$count"}}
])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值