mongodb过滤器和仅项目具有所提供模式的最大id的文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb过滤器和仅项目具有所提供模式的最大id的文档相关的知识,希望对你有一定的参考价值。
假设我们有以下文件:
{
reportName: 'ABC_REPORT'
reports: [
{
"startDate" : ISODate("2017-07-02T00:00:00Z"),
"endDate" : ISODate("2017-07-08T00:00:00Z"),
"data" : [ { DATA_ID: '0123404' }, { DATA_ID: '111101' }, { DATA_ID: '22201' } ]
},
{
"startDate" : ISODate("2017-07-09T00:00:00Z"),
"endDate" : ISODate("2017-07-15T00:00:00Z"),
"data" : [ { DATA_ID: '111103' } ] },
{
"startDate" : ISODate("2017-07-16T00:00:00Z"),
"endDate" : ISODate("2017-07-22T00:00:00Z"),
"data" : [{ DATA_ID: '0123403' }, { DATA_ID: '111109' }]
},
{
"startDate" : ISODate("2017-07-16T00:00:00Z"),
"endDate" : ISODate("2017-07-22T00:00:00Z"),
"data" : [{ DATA_ID: '0123402' }]
}
]}
现在我想编写一个查询,该查询应该搜索以('01234','1111','222')开头的DATA_ID。如果对于每个模式,它返回多个DATA_ID,那么结果应该只有最大的一个。只有相同模式的最后两位数才会递增。
期待获得如下数组:
{
data: [{ DATA_ID: '111109' },
{ DATA_ID: '0123404' },
{ DATA_ID: '22201' }
]
}
我试图通过聚合框架来解决这个问题但是真的在努力解决这个问题。
答案
如果你需要最大的长度
db.col.aggregate([
{
$unwind:"$reports"
},
{
$unwind:"$reports.data"
},
{
$replaceRoot:{ newRoot:"$reports.data"}
},
{
$project:{
"DATA_ID":1,
"GRP_ID":{
$switch: {
branches: [
{ case: {$eq:[{ $indexOfBytes:["$DATA_ID","01234"]},0]}, then: "0124" },
{ case: {$eq:[{ $indexOfBytes:["$DATA_ID","xyz"]},0]}, then: "xyz" },
{ case: {$eq:[{ $indexOfBytes:["$DATA_ID","abcd"]},0]}, then: "abcd" }
],
default: ""
}
}
}
},
{
$group:{
_id:"$GRP_ID",
DATA_IDS:{$addToSet:"$DATA_ID"}
}
},
{
$project:{
_id:0,
DATA_ID:{
$reduce:{
input:"$DATA_IDS",
initialValue:"",
in:{$cond:[{$gte:[{$strLenCP:"$$this"},{$strLenCP:"$$value"}]},"$$this","$$value"]}
}
}
}
}
])
如果你需要最大的重量
db.col.aggregate([
{
$unwind:"$reports"
},
{
$unwind:"$reports.data"
},
{
$replaceRoot:{ newRoot:"$reports.data"}
},
{
$project:{
"DATA_ID":1,
"GRP_ID":{
$switch: {
branches: [
{ case: {$eq:[{ $indexOfBytes:["$DATA_ID","01234"]},0]}, then: "0124" },
{ case: {$eq:[{ $indexOfBytes:["$DATA_ID","xyz"]},0]}, then: "xyz" },
{ case: {$eq:[{ $indexOfBytes:["$DATA_ID","abcd"]},0]}, then: "abcd" }
],
default: ""
}
}
}
},
{
$group:{
_id:"$GRP_ID",
DATA_IDS:{$addToSet:"$DATA_ID"}
}
},
{
$project:{
_id:0,
DATA_ID:{
$reduce:{
input:"$DATA_IDS",
initialValue:"",
in:{$cond:[{$gte:["$$this","$$value"]},"$$this","$$value"]}
}
}
}
}
])
以上是关于mongodb过滤器和仅项目具有所提供模式的最大id的文档的主要内容,如果未能解决你的问题,请参考以下文章
php WordPress前端上传器和仅限当前用户的媒体过滤器
有没有办法在 MongoDB 中创建一个具有多个值的过滤器?