Mongodb按月查找子文档

Posted

技术标签:

【中文标题】Mongodb按月查找子文档【英文标题】:Mongodb find subdocument by month 【发布时间】:2021-07-05 09:37:53 【问题描述】:

我有一个包含以下文档的集合。


    "id":1,
    "url":"mysite.com",
    "views":
     [
       "ip":"1.1.1.1","date":ISODate("2015-03-13T13:34:40.0Z"),
       "ip":"2.2.2.2","date":ISODate("2015-03-13T13:34:40.0Z"),
       "ip":"1.1.1.1","date":ISODate("2015-02-13T13:34:40.0Z"),
       "ip":"1.1.1.1","date":ISODate("2015-02-13T13:34:40.0Z")
     ]
,

    "id":2,
    "url":"mysite2.com",
    "views":
     [
       "ip":"1.1.1.1","date":ISODate("2015-06-13T13:34:40.0Z"),
       "ip":"2.2.2.2","date":ISODate("2015-08-13T13:34:40.0Z"),
       "ip":"1.1.1.1","date":ISODate("2015-11-13T13:34:40.0Z"),
       "ip":"1.1.1.1","date":ISODate("2015-11-13T13:34:40.0Z")
     ]

我如何才能找到在 6 月至少有一次查看的文档?我知道如何使用聚合(展开 > 项目 > $month > 匹配 > 组),但是有没有不聚合的方法呢?只使用 db.find()?

【问题讨论】:

您是指某个特定年份的六月还是六月? 【参考方案1】:

这个有效:

db.collection.find(
   
      $expr: 
         $in: [6,  $map:  input: "$views", in:  $month: "$$this.date"   ]
      
   
)

但聚合管道并没有真正的区别:

db.collection.aggregate([
   
      $match: 
         $expr: 
            $in: [6,  $map:  input: "$views", in:  $month: "$$this.date"   ]
         
      
   
])

如果您需要查找几个月,例如“六月或十一月”使用这个:

db.collection.find(
   
      $expr: 
         $gt: [0,  $size:  $setIntersection: [[6, 11],  $map:  input: "$views", in:  $month: "$$this.date"   ]  ]
      
   
)

【讨论】:

您在聚合管道中尝试过allowDiskUse: true 吗?否则,您真的必须使用 $month: "$views.date" 更新集合并在其上创建索引

以上是关于Mongodb按月查找子文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:查找没有子文档符合条件的文档

MongoDB:查找没有子文档符合条件的文档

在 Mongodb 中查找和聚合多个级别的子文档

如何在任意深度查找 MongoDB 字段名称

我可以对索引子文档字段执行 MongoDB“开始于”查询吗?

Mongodb检查数组的子文档中是否存在字段