导读
本文档主要讲述在内嵌文档中数据的筛选,内容如下
- 获取内嵌文档某特定数据
- 获取多个内嵌文档的某特定数据
- 获取多层级内嵌文档中的某特定数据
- 获取内嵌文件特定数据,并利用排序和分页筛选
测试数据
{
"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"}}
])