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 搜索/过滤不参考架构的数据

有没有办法在 MongoDB 中创建一个具有多个值的过滤器?

仅当非空值时,如何在输入和过滤数据中具有默认的 NULL 值?

mongodb设计模式策略之读书笔记

具有特定条件计数的 Mongodb 聚合并按输出投影的日期范围过滤不能按预期工作